ホームページ  >  記事  >  バックエンド開発  >  C++ 同時プログラミング: スレッドの同期と相互排他を実行するにはどうすればよいですか?

C++ 同時プログラミング: スレッドの同期と相互排他を実行するにはどうすればよいですか?

王林
王林オリジナル
2024-05-05 10:00:02799ブラウズ

複数のスレッドが共有リソースに同時にアクセスする場合、スレッドの同期は非常に重要です。 C は、同期を実現するために、ミューテックス、条件変数、およびアトミック操作を提供します。ミューテックスにより、一度に 1 つのスレッドのみがリソースにアクセスできるようになり、条件変数はスレッド間通信に使用され、アトミック操作により単一の操作が中断されなくなります。たとえば、ミューテックスを使用して共有キューへのアクセスを同期し、データの破損を防ぎます。

C++ 同時プログラミング: スレッドの同期と相互排他を実行するにはどうすればよいですか?

C 同時プログラミング: スレッドの同期と相互排他

概要

スレッド複数のスレッドが共有リソースに同時にアクセスする場合、データの整合性を確保するには同期が鍵となります。 C は、ミューテックス、条件変数、アトミック操作など、スレッド同期のためのさまざまなメカニズムを提供します。

Mutex (ミューテックス)

ミューテックスは、一度に 1 つのスレッドのみが共有リソースにアクセスできるようにするオブジェクトです。ミューテックスは次のように使用されます。

std::mutex m;

void func() {
  std::lock_guard<std::mutex> lock(m);  // 获取互斥体锁
  // 访问共享资源
  // ...
}

std::lock_guard は、ミューテックスのロックを表す RAII タイプです。 func() 関数が実行されると、ロックは自動的に解放されます。

条件変数

条件変数はスレッド間の通信に使用されます。これにより、あるスレッドは、別のスレッドが特定の条件を満たすまで待機することができます。使用法は次のとおりです。

std::condition_variable cv;

void wait() {
  std::unique_lock<std::mutex> lock(m);
  cv.wait(lock);  // 等待条件变量
}

void notify() {
  std::unique_lock<std::mutex> lock(m);
  cv.notify_one();  // 通知等待的线程
}

std::unique_lock は、ミューテックスの排他ロックを表します。 wait() 関数が呼び出されると、スレッドは notify_one() 関数が呼び出されるまでブロックされます。

アトミック操作

アトミック操作は、単一の操作を中断することなく実行できることを保証する低レベルの同期メカニズムです。使用法は次のとおりです。

std::atomic<int> counter;

void increment() {
  counter++;  // 原子地递增计数器
}

実用的なケース

複数のスレッドが共有キューにアクセスしており、キュー サイズに上限があるシナリオを考えてみましょう。スレッドが同時にキューにアクセスしてデータ破損を引き起こすことを防ぐために、ミューテックスを使用してキューへのアクセスを同期できます:

std::mutex m;
std::queue<int> queue;
const int MAX_SIZE = 10;  // 队列最大容量

void producer() {
  while (true) {
    std::lock_guard<std::mutex> lock(m);
    if (queue.size() < MAX_SIZE) {
      queue.push(rand());
    }
  }
}

void consumer() {
  while (true) {
    std::lock_guard<std::mutex> lock(m);
    if (!queue.empty()) {
      std::cout << queue.front() << std::endl;
      queue.pop();
    }
  }
}

以上がC++ 同時プログラミング: スレッドの同期と相互排他を実行するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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