ミューテックスなしで pthread_cond_signal を呼び出すとシグナリングが侵害されますか?
一部の文献では、pthread_cond_signal を呼び出すには、事前にミューテックスをロックし、後でロックを解除する必要があると示唆されています。しかし、ミューテックスをロックせずに pthread_cond_signal または pthread_cond_broadcast を呼び出すことはできますか?
答え:
いいえ、最初にミューテックスをロックせずに pthread_cond_signal または pthread_cond_broadcast を呼び出すのは安全ではありません。これは、2 つのプロセス (A と B) を含む簡単な例で説明されています。
プロセス A:
pthread_mutex_lock(&mutex); while (condition == FALSE) pthread_cond_wait(&cond, &mutex); pthread_mutex_unlock(&mutex);
プロセス B (誤):
condition = TRUE; pthread_cond_signal(&cond);
条件が FALSE として開始され、プロセス B が通知なしでシグナルを送信しようとした場合ミューテックス ロックを使用すると、命令のインターリーブによりプロセス A がウェイクアップ信号を見逃す可能性があります。
プロセス B (正解):
pthread_mutex_lock(&mutex); condition = TRUE; pthread_cond_signal(&cond); pthread_mutex_unlock(&mutex);
プロセス B のミューテックスをロックすると、この問題が回避され、プロセス A がウェイクアップ信号を確実に受信できるようになります。
注: 技術的には可能ですが、 pthread_cond_signal() を pthread_mutex_unlock() の後に移動することは、スレッドのスケジューリング効率が低下するため、推奨されません。
以上がミューテックスなしで「pthread_cond_signal」を呼び出すのは安全ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。