0

1 つのプロデューサーと n 人のコンシューマーがいます。プロデューサーは、n 個のジョブを n 個のコンシューマーに割り当て、pthread_cond_wait() を n 回呼び出して、割り当てられたジョブがコンシューマーによって完了するのを待ちます。各 Consumer は、ジョブを消費した後、 pthread_cond_signal() を呼び出してプロデューサーに通知します。

私の質問は、「消費者による pthread_cond_signal() への n 回の呼び出しにより、プロデューサーは pthread_cond_wait() から n 回出るようになりますか?または、pthread_cond_wait() が出てくる回数が n 回未満になるように、複数のシグナルが単一のシグナルにマージされる場合はありますか? ?

4

1 に答える 1

0

pthread_cond_wait()プロデューサーが、コンシューマースレッドが呼び出したときの呼び出し内で実際に待機していない場合、pthread_cond_signal()そのシグナルは「失われます」(つまり、プロデューサースレッドが後でロールインした場合、pthread_cond_wait()別のシグナルが送信されるまでブロックされます)。

そのため、条件変数は、条件変数で使用されるミューテックスを保持しているときにチェックされる他の「ブール述語」と組み合わせて使用​​する必要があります。その述語は、待機するかどうかを決定するスレッドが待機する必要があるかどうかに関する実際の最後の単語です。述語が最後の単語であるもう1つの理由は、ブロックされたスレッドpthread_cond_wait()が誤って目覚める可能性があることです。

POSIXドキュメントからpthread_cond_wait()

条件変数を使用する場合、スレッドが続行する必要がある場合にtrueとなる、各条件待機に関連付けられた共有変数を含むブール述語が常に存在します。pthread_cond_timedwait()またはpthread_cond_wait()関数からの誤ったウェイクアップが発生する可能性があります。pthread_cond_timedwait()またはpthread_cond_wait()からの戻りは、この述語の値について何も意味しないため、そのような戻り時に述語を再評価する必要があります。

于 2013-03-20T07:17:46.967 に答える