ホームページ  >  記事  >  バックエンド開発  >  ミューテックスはマルチスレッド プログラムでのデータ破損をどのように防ぐのでしょうか?

ミューテックスはマルチスレッド プログラムでのデータ破損をどのように防ぐのでしょうか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-11-20 15:38:13490ブラウズ

How do Mutexes Prevent Data Corruption in Multithreaded Programs?

ミューテックスの例とチュートリアル

マルチスレッド プログラミングでは、ミューテックスは共有リソースへのアクセスを調整する上で重要な役割を果たします。ただし、初心者にとってその機能を理解するのは難しい場合があります。例えとプログラム例を使用して、簡略化した説明を詳しく見てみましょう。

例え: 電話ボックス

混雑した通りに公衆電話ボックスが 1 つあると想像してください。複数の人 (スレッド) が電話 (共有リソース) を使用したいと考えていますが、一度に使用できるのは 1 人だけです (相互排他)。混乱を防ぐため、ドアハンドル (ミューテックス) が設置されています。

最初にブースに入った人がハンドルを握ると、ミューテックスにロックがかかります。これは、リソースが使用中であることを他の人に示します。その人が内部にいる間はハンドルがロックされているため (相互排他)、他の人はそのハンドルを握ることはできません。

スレッドとミューテックスの相互作用

マルチスレッド プログラムでは、スレッドは次のことを表します。私たちのたとえ話では人々です。ミューテックスは、共有リソースへのアクセスを制御する変数です。リソースを保護するには、スレッドは最初にミューテックスのロックを取得する必要があります。これにより、他のスレッドによるリソースへのアクセスがブロックされます。

スレッドがロックを取得すると、リソースに排他的にアクセスできるようになります。完了するとロックが解放され、別のスレッドがロックを取得できるようになります。これにより、共有リソースへの同時アクセスが防止され、データ破損につながる可能性があります。

サンプル プログラム

ミューテックスがどのように機能するかを示す簡単な C 11 の例を次に示します。

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

std::mutex m;
int i = 0;

void makeACallFromPhoneBooth()
{
    m.lock();
    std::cout << i << " Hello Wife" << std::endl;
    i++;
    m.unlock();
}

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

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

この例では、変数 m がミューテックスとして機能します。これにより、一度に 1 つのスレッドだけが共有変数 i を使用できるようになります。ミューテックスがないと、複数のスレッドが i を同時に変更する可能性があり、不正確な結果が生じる可能性があります。

ロック構文

構文 pthread_mutex_lock(&mutex1) は、ミューテックスのロックを取得します。 mutex1 という名前。これは、ミューテックスによって保護されているコード領域が現在ロックされていることを他のスレッドに通知します。

スレッドは、ロックが保持されている間にその領域にアクセスすることを回避できるように、ロックされた領域について知る必要があります。スレッドがロックされた領域にアクセスしようとすると、ロックが解放されるまでブロックされます。

結論

ミューテックスは、マルチスレッド プログラミングにおいて不可欠なメカニズムであり、共有されることを保証します。リソースへのアクセスは、制御され同期された方法で行われます。データの破損を回避し、効率的なマルチスレッドを実現するには、それらの機能を理解することが重要です。

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

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