2016-05-10 6 views
0

私はPOSIXで作業していますが、スレッドは3つあります。pthread_cond_broadcastは、条件変数で待機していないスレッドのブロックを解除します。

以下のすべてのスレッドは、同じmutexロックを使用しています。

スレッド1は、条件を満たすためにpthread_cond_waitを使用して待機しています(待機はwhileループ内にあるため、無条件待機でもありません)。 スレッド2は、条件が満たされたときにpthread_cond_broadcastを発行します。 スレッド3は、ロックにmutexを使用しますが、条件変数を待つことはありません。

スレッド1はシグナル/ブロードキャストを待っていて、スレッド3はミューテックスロックを待っています(このスレッドはミューテックスロックを取得するための待機中です)。スレッド2がブロードキャストを送信すると、スレッド3はスレッド1ではなくミューテックスを取得しています。なぜこれが起こりますか?私はglibc2.19を使ってdebian 8.3を使用しています。 条件付き変数を待っていたスレッドをブロードキャストで起動してはいけませんか?

+0

ミューテックスが他のスレッドに保持されなくなったら、それを取得するのを待っているスレッドはいけませんか? – EOF

答えて

1

私はスレッド2でロックされたmutexを持っていると仮定します(あなたの質問は意味がありません)。したがって、pthread_cond_broadcastを呼び出すと、条件変数で待機しているスレッドのブロックを解除するだけです。実行転送は起こっていません。

次に、mutexのブロックを解除し、待機中のスレッドをスケジュールする必要があると考えます。しかし、この予定は間違っています。スケジュールする次のスレッドを決定するのはスケジューラの責任であり、mutexがロックされていないためスレッド3のブロックが解除されているからです。だから、スケジューラは、次に実行するスケジューラ(1または3)を決定することになります。このような状況では何も制約を受けません。

+0

ありがとうixSci、私の質問をクリアします。 – VasanthRagavendran

関連する問題