ミューテックスをロックせずに pthread_cond_signal を呼び出す: 信頼性の低いウェイクアップ
一般的な誤解とは異なり、ミューテックスを取得せずに pthread_cond_signal または pthread_cond_broadcast を呼び出すと、エラーが発生する可能性があります。目覚め、スレッドの同期が損なわれています。
ミューテックス ロックが不可欠な理由
pthread_cond_signal 関数は、関連する条件が変更されたことを待機中のスレッドに通知します。ただし、条件に関連する共有データを保護するミューテックスがロックされていない場合、競合状態が発生する可能性があります。
1 つのスレッド (A) が条件変数を待機し、別のスレッド (B) が待機しているシナリオを考えてみましょう。 ) 条件を true に設定し、pthread_cond_signal を呼び出します。ミューテックス ロックを使用しないと、スレッド A が条件をチェックしており、まだ pthread_cond_wait 呼び出しに入っていないときに、スレッド B がシグナルを送る可能性があります。
ウェイクアップが失敗するリスク
この競合状態の結果、スレッド A はウェイクアップ信号を見逃し、無期限に待機し続ける可能性があります。この状況は、スレッド A がクリティカル セクションを実装しており、共有データへの変更を即座に通知する必要がある場合に特に問題になります。
正しい同期パターン
信頼性の高いウェイクアップを確保するには、次の同期パターンに厳密に従う必要があります:
pthread_mutex_lock(&mutex); // Change shared data pthread_cond_signal(&cond); pthread_mutex_unlock(&mutex);
スレッド B は、ミューテックスを取得した後にのみシグナルを送信し、共有データを変更し、保留中のウェイクアップがスレッド A によって確実に受信されるようにします。
結論
pthread_cond_signal の呼び出しの周囲でミューテックスをロックすることは、スレッドの同期と目覚めの逃しを防ぎます。そうしないと、予測不可能で壊滅的な競合状態が発生する可能性があります。
以上がミューテックス ロックを使用せずに「pthread_cond_signal」を呼び出すと信頼性の低いウェイクアップが発生するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。