2011-10-18 10 views
3

との同期プリミティブ:私は次のように働いてIO /キットの原始待機/信号同期を探していますIO /キット

スレッド1:スレッド1

スレッド2ブロッキング//(myEventを)待つ:(待つmyEvent )//スレッド2

Thread3ブロッキング:信号(myEvent)は、ロック/操作のロックを解除するので、これは、異なるスレッドから作られるであろうIOLOCKを使用して行うことができないスレッド1の一つまたはスレッド2

をリリース//私が読んだいくつかの医者によると、悪い考えです。

スレッド1,2,3は、ユーザースレッドまたはカーネルスレッドです。

私はまた、待機操作でオプションのタイムアウトが必要です。

ありがとうございました!

答えて

2

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

IOLockのいずれかをIOLockAlloc()のどこかに設定してください。次に、スレッド1とスレッド2は、IOLockLock()でIOLockをロックし、直ちにロックを放棄し、IOLockSleepDeadline()を呼び出してスリープ状態になります。スレッド3の準備が整うと、IOLockWakeup()が呼び出されます(1つのスレッドのみをウェイクさせたい場合はoneThread = true)。これにより、スレッド1または2が起動し、すぐにロックを取得します(ロック解除またはスリープする必要があります)。

IOLockSleep()も同様ですが、タイムアウトはありません。

the IOCommandGate's commandSleep() methodを使用して同様のことを行うことができます。これは、お使いのドライバが既にIOWorkLoopを中心にしている場合に、より適切です。

+0

はい、それです! – Julien

0

次のことを述べてIOLocks::IOLockLock方法の文書化:

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

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

関連する問題