質問は、私が一瞥した条件変数に関する投稿についてです。条件変数
作者は最初にバグのある例を挙げます:
/* in thread 1 */
pthread_mutex_lock(mx);
if (state == GOOD) {
pthread_mutex_unlock(mx); // Here !
wait_for_event();
pthread_mutex_lock(mx);
}
pthread_mutex_unlock(mx);
/* in thread 2 */
pthread_mutex_lock(mx);
state = GOOD;
pthread_mutex_unlock(mx);
signal_event(); /* expecting to wake thread 1 up */
そして次のように説明します:
'この擬似コードのサンプルにはバグがあります。スケジューラーが、pthread_mutex_unlock(mx)の後、wait_for_event()の前に、コンテキストをスレッド1からスレッド2に切り替えることを決定した場合はどうなりますか。この場合、スレッド2はスレッド1をウェイクアップせず、スレッド1はおそらく永久にスリープ状態を継続します。
著者が後で同じ投稿で示したように、私は条件変数がどのように使用されるべきかを知っています。
このバグのある例では、「state ==GOOD」の判断と「wait_for_event()」がミューテックスによって全体としてロックされていないことがわかります。そして、スレッド1が最初の' pthread_mutex_unlock(mx);の直後にコンテキストスイッチされた場合。'、スレッド2は'状態'を他の何か(悪い?)に変更し、スレッド1をウェイクアップして'状態==GOOD'ロジックに進むように信号を送ることができます。これは間違っていると思います。
しかし、なぜ作者は「この場合、スレッド2はスレッド1をウェイクアップせず、スレッド1はおそらく永久にスリープ状態を継続します。」と言います。
'signal_event();'ではありません まだスレッド2で呼び出されていますか?私の理解はまったく正しかったですか?