2012-01-23 6 views
2

私は教科書のコードを見ている:David R. ButenhofによるPOSIXスレッドを使ったプログラミング。私はちょっと混乱している場所に出くわした。pthread_cond_waitにあるスレッドが関連するmutexを再獲得する間、スレッドをキャンセルしますか?

コードでは、スレッドに対してクリーンアップハンドラが登録されています。クリーンアップハンドラは、そのスレッド内の条件によって使用されるミューテックスのロックを解除します。

スレッドがgenerealの場合、pthread_cond_waitが呼び出されると(関連するmutexがロックされている必要があります)、mutexはロックされていますが、スレッドは待機しています。すなわち、信号または放送が起こった)。

condition_waitにはmutexがロックされていないため、スレッドが待機中に取り消された場合でも、そのmutexはロックされていないと考えられます。なぜクリーンアップハンドラはフリーにする必要がありますか?それ?

実際に、私はすでにロックされていたmutexのロックを解除することは実際にはエラーであり、これを悪化させると考えました。誰かが私が混乱していると思うところを教えてもらえますか?

答えて

3

Bad Thing™のロックが解除されているミューテックスのロック解除について正しいです。

ただし、pthread_cond_wait()はキャンセルポイントですが、インターフェイスはキャンセルハンドラが実行される前にmutexが再取得されることを保証します。この保証をしなければ、ミューテックスが保有されているかどうかを知ることは非常に難しいでしょう。

参照:詳細はThe specificationを参照してください。

+0

参考に感謝します:) –

関連する問題