IO/キットとのプリミティブの同期
-
25-10-2019 - |
質問
IO/KITでの待機/信号同期プリミティブを探しています。
Thread1:wait(myevent)//ブロッキングスレッド1
Thread2:wait(myevent)//ブロックスレッド2
スレッド3:信号(myevent)// thread1またはthread2の1つをリリースします
ロック/ロック解除操作はさまざまなスレッドから作成されるため、これはiolockを使用して実行できません。これは、私が読んだいくつかのドキュメントによると悪い考えです。
Thread1、2、3はユーザースレッドまたはカーネルスレッドになります。
また、待機操作でオプションのタイムアウトが必要です。
ご協力いただきありがとうございます !
解決
関数が必要です IOLockSleepDeadline()
, 、宣言されています <IOKit/IOLocks.h>
.
シングルをセットアップします IOLock
どこかで IOLockAlloc()
あなたが始める前に。次に、スレッド1と2はiolockをでロックします IOLockLock()
そしてすぐにロックを放棄して、電話して眠りにつく IOLockSleepDeadline()
. 。スレッド3の準備ができたら、呼び出します IOLockWakeup()
(と oneThread = true
単一のスレッドを覚ます場合の場合)。これにより、スレッド1または2が目を覚まし、すぐにロックを取得します(したがって、再びロックを解除するかスリープする必要があります)。
IOLockSleep()
同様に機能しますが、タイムアウトなしで動作します。
あなたは使用して同様のことをすることができます iocommandgateのCommandSleep()メソッド ドライバーがすでに中心にある場合、これはより適切かもしれません IOWorkLoop
.
他のヒント
メソッドのドキュメント IOLocks::IOLockLock
次のように述べています:
ミューテックスをロックします。ロックが任意のスレッドによって保持されている場合は、ロック解除を待っているブロックをブロックします。この関数はブロックされる可能性があるため、割り込みレベルから呼び出されたり、スピンロックが保持されている間は呼ばれないでください。 1つのスレッドからミューテックスを再帰的にロックすると、デッドロックが発生します。
したがって、ロックを保持するスレッドが解放されるまで(T3)、他のスレッド(T1およびT2)をブロックすることは確かです。それがサポートしていないと思われることの1つは、タイムアウトです。