3つのスレッドだけが待機している間にブロードキャストスレッドがブロードキャストし、ブロードキャストスレッドがブロードキャストを終了した後の4番目のスレッドの呼び出しpthread_cond_wait
は、4番目のスレッドが待機状態から抜け出すと言います。また、条件変数はどのようにリセットされるので、ブロードキャストスレッドは後で待機中のスレッドに再ブロードキャストできるようになります。
2 に答える
4番目のスレッドは待機状態から抜け出しますか
いいえ、別の放送または信号が出るまではありません。
また、条件変数はどのようにリセットされるので、ブロードキャストスレッドは後で待機中のスレッドに再ブロードキャストできるようになります。
条件変数が行うすべてのことは、条件変数に関連付けられたミューテックスの下で同期されることを想像するのが最も簡単です。したがって、ブロードキャストするとき、待機しているものはすべて(どういうわけか)ウェイクアップしてミューテックスを取得しようとしている状態になります。次に、ブロードキャストスレッドがミューテックスを解放します。したがって、ブロードキャスト時に「リセット」されるのは実際には条件変数ではなく、条件変数の待機からミューテックスの待機に移行する最初の3つのスレッドです。
condvarを待機するには、4番目のスレッドが最初にミューテックスを取得する必要があります。これは、最初の3つのスレッドがウェイクアップしてミューテックスを取得する前または後に発生する可能性がありますが、ブロードキャスト後に明らかに発生するため、4番目のスレッドは「ウェイクアップしようとしている」状態ではなく「信号を待機中」になっています。またはブロードキャスト」状態。
実際には、それよりも複雑です。条件変数をブロードキャストするために、実際にミューテックスを保持する必要はありません。したがって、条件変数には、ブロードキャストの前に待機しているすべてのスレッドが単一の操作として状態を変更できるようにするために、いくつかの追加の内部同期を含める必要があります(Linuxの具体的な詳細はわかりません)。
通常は、ミューテックスを保持してブロードキャストすることもできますが、ウェイターが見たいものを変更したときにブロードキャストし、多くのスレッドから見たものはすべて、ミューテックスを使用して同期されます。そして、常にそのようにすることで回避できる厄介な状況がいくつかあります。
4番目のスレッドは待機状態から抜け出します。
いいえ、スレッド4が待機している間に条件変数が通知されない限り、そうではありません。
マニュアルページは説明します:
この
pthread_cond_broadcast()
呼び出しは、指定された条件変数で現在ブロックされているすべてのスレッドのブロックを解除しますcond
。で現在ブロックされているスレッドがない場合、and関数は効果がありませ
pthread_cond_signal()
ん。pthread_cond_broadcast()
cond