ホームページ  >  記事  >  バックエンド開発  >  ミューテックスはマルチスレッド プログラミングにおける競合状態をどのように防ぐのでしょうか?

ミューテックスはマルチスレッド プログラミングにおける競合状態をどのように防ぐのでしょうか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-11-11 15:18:02655ブラウズ

How do Mutexes Prevent Race Conditions in Multithreaded Programming?

ミューテックスの概念: 簡易チュートリアル

ミューテックス (相互排他ロックの略) は、複数のスレッドが共有リソースに同時にアクセスすることを防ぎます。どのように機能するかを理解するために、次のような例えを考えてみましょう。

電話ボックスの例

ドア ハンドルが付いた 1 つの電話ボックスを想像してください。電話を使用するために人々 (スレッド) が列に並んでいますが、ドアハンドルを握った人だけが電話を使用できます。彼らが手を放した瞬間に、別の人が順番を引き継ぐことができます。

このたとえでは:

  • 各人は スレッド を表します。
  • ドア ハンドルは ミューテックス を表します。
  • ドア ハンドルを握ることは、ミューテックスのロックを表します。
  • 電話の使用は、保護されたコードの実行を表します.

ミューテックス ロジック

スレッドは、pthread_mutex_lock(&mutex) を呼び出してミューテックスのロックを取得します。これにより、コードの領域がそのスレッド専用としてマークされます。

スレッドがそのコードの実行を終了すると、pthread_mutex_unlock(&mutex) を呼び出してロックを解放します。これにより、ロックを取得して保護されたコードを実行できるようになったことが他のスレッドに通知されます。

簡単なミューテックスの例

次の C 11 コードは、ミューテックスの概念を示しています。

#include <iostream>
#include <thread>
#include <mutex>

std::mutex m;
int i = 0;

void makeACallFromPhoneBooth() {
    m.lock();  // Thread acquires lock on mutex (grabs door handle)
    std::cout << i << " Hello Wife" << std::endl;  // Protected code
    i++;  // No other thread can modify i while lock is held
    m.unlock();  // Thread releases lock (lets go of door handle)
}

int main() {
    std::thread man1(makeACallFromPhoneBooth);
    std::thread man2(makeACallFromPhoneBooth);
    std::thread man3(makeACallFromPhoneBooth);

    man1.join();
    man2.join();
    man3.join();
    return 0;
}

この例では、3 つのスレッド (人々) が共有リソース (電話) を使用しようとします。ミューテックスにより、一度に 1 つのスレッドだけがリソースにアクセスできるようになります。

以上がミューテックスはマルチスレッド プログラミングにおける競合状態をどのように防ぐのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。