ホームページ > バックエンド開発 > C++ > ミューテックスなしで「pthread_cond_signal」を呼び出すのは安全ですか?

ミューテックスなしで「pthread_cond_signal」を呼び出すのは安全ですか?

DDD
リリース: 2024-12-03 16:53:10
オリジナル
513 人が閲覧しました

Is Calling `pthread_cond_signal` Without a Mutex Safe?

ミューテックスなしで 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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート