3

次のように動作する IO/Kit で待機/シグナル同期プリミティブを探しています。

Thread1 : wait(myEvent) // スレッド 1 をブロックしています

Thread2 : wait(myEvent) // スレッド 2 をブロックしています

Thread3 : signal(myEvent) // スレッド 1 またはスレッド 2 のいずれかを解放します

ロック/ロック解除操作は異なるスレッドから行われるため、これは IOLock を使用して行うことはできません。これは、私が読んだドキュメントによると悪い考えです。

Thread1、2、3 は、ユーザー スレッドまたはカーネル スレッドにすることができます。

また、待機操作でオプションのタイムアウトを設定したいと思います。

ご協力いただきありがとうございます !

4

2 に答える 2

3

IOLockSleepDeadline()で宣言された関数が必要です<IOKit/IOLocks.h>

IOLock始める前に、どこかにシングルを設定しIOLockAlloc()ます。次に、スレッド1と2はIOLockをロックしIOLockLock()、すぐにロックを解除して、を呼び出してスリープ状態になりIOLockSleepDeadline()ます。IOLockWakeup()スレッド3の準備ができると、 (oneThread = true単一のスレッドのみをウェイクアップする場合に)呼び出します。これにより、スレッド1または2がウェイクアップし、すぐにロックを取得します(したがって、ロックを解除するか、再度スリープする必要があります)。

IOLockSleep()同様に機能しますが、タイムアウトはありません。

IOCommandGateのcommandSleep()メソッドを使用して同様のことを行うことができます。これは、ドライバーがすでに。を中心としている場合に適していますIOWorkLoop

于 2011-11-01T19:58:57.087 に答える
0

メソッドのドキュメントにIOLocks::IOLockLockは、次のように記載されています。

ミューテックスをロックします。ロックがいずれかのスレッドによって保持されている場合は、ロック解除の待機をブロックします。この関数はブロックされる可能性があるため、割り込みレベルから、またはスピンロックが保持されている間は呼び出さないでください。1つのスレッドからミューテックスを再帰的にロックすると、デッドロックが発生します。

したがって、ロックを保持しているスレッドがロックを解放するまで(T3)、他のスレッド(T1およびT2)を確実にブロックします。サポートされていないように見えることの1つは、タイムアウトです。

于 2011-10-18T13:44:33.930 に答える