1

私は生産者/消費者プログラムを書いています。キューから読み取る 3 つのコンシューマーと、キューに書き込む 1 つのプロデューサーがあります。プロデューサーがキューに何かを書き込むと、phtread_cond_broadcast を使用してブロードキャストします。その後、消費者は目を覚ますが、私は自分のプログラムにパターンを見つけた. 消費者の 1 人は、常に他の消費者より先にウェイクアップし、キューをクリアします。私の質問は、ブロードキャストが毎回同じ順序ですべてのスレッドをウェイクアップするのは正常ですか?

プロデューサー :

pthread_mutex_lock(&mutex1);
if(/* write something */)
phtread_cond_broadcast(&cond1)
pthread_mutex_unlock(&mutex1);

消費者 :

pthread_mutex_lock(&mutex1);
while(/* queue vide */)
phtread_cond_wait(&cond1);
pthread_mutex_unlock(&mutex1);
4

2 に答える 2

0

マニュアルページによるとIf more than one thread is blocked on a condition variable, the scheduling policy determines the order in which threads are unblocked.

したがって、一連の要因 (スケジューリング ポリシー、ライブラリ バージョンなど) が同じであれば、順序も同じになるように思えます。

于 2013-03-26T14:53:22.060 に答える
0

プロデューサが何かを書いたときに 1 つのコンシューマだけが作業を行う可能性がある場合は、pthread_cond_signal()代わりに使用することを検討する必要があります。そうすれば、すべてのコンシューマーではなく、1 つだけ (ドキュメントによると、複数になる可能性があります) を起動します。それらすべてを目覚めさせると、全員が同じ作業項目を急いでつかもうとする「雷鳴の群れ」現象が発生し、その後、ほとんどの人が何もせずに眠りに戻ります。

于 2013-03-26T13:29:02.207 に答える