質問

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つは、タイムアウトです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top