これについて: 条件変数の使用方法
そのようなコードを実行するコンシューマースレッドがいくつかあるとします(参照ページからコピー):
while (TRUE) {
s = pthread_mutex_lock(&mtx);
while (avail == 0) { /* Wait for something to consume */
s = pthread_cond_wait(&cond, &mtx);
}
while (avail > 0) { /* Consume all available units */
avail--;
}
s = pthread_mutex_unlock(&mtx);
}
ここでのシナリオは次のとおりです。メインスレッドはpthread_cond_signal()を呼び出して、コンシューマースレッドに何らかの作業を行うように指示します。
私が理解しているように、後続のスレッドはpthread_mutex_lock()を呼び出し、次にpthread_cond_wait()(ミューテックスをアトミックにロック解除します)を呼び出します。今では、どのコンシューマースレッドもミューテックスを要求しておらず、すべてpthread_cond_wait()を待機しています。
メインスレッドがpthread_cond_signal()を呼び出すと、マンページに続いて、少なくとも1つのスレッドがウェイクアップされます。それらのいずれかがpthread_cond_wait()から戻ると、自動的にミューテックスを要求します。
だから私の質問は:提供されたサンプルコードに関して今何が起こっているのですか?つまり、ミューテックスのコンテストに負けたスレッドは今何をしているのでしょうか?
(ミューテックスを獲得したスレッドは、残りのコードを実行してミューテックスを解放する必要があります。失われたスレッドは、ミューテックスを待機している必要があります-最初のネストされた while
ループのどこか-勝者がそれを保持し、解放された後それまでに満たされるので、pthread_cond_wait()でブロックを開始しwhile (avail == 0)
ます。私は正しいですか?)