ホームページ >バックエンド開発 >C++ >サーバー アーキテクチャにおける C++ スレッド同期メカニズムの比較

サーバー アーキテクチャにおける C++ スレッド同期メカニズムの比較

王林
王林オリジナル
2024-06-04 10:52:57982ブラウズ

マルチスレッド環境で共有リソースへのスレッドの順序正しいアクセスを保証するために、C++ は次のスレッド同期メカニズムを提供します: Mutex (ミューテックス): 重要なセクションへの相互排他的アクセスを提供し、同時に 1 つのスレッドのみがアクセスできるようにします。 。条件変数 (Condition Variable): 特定の条件が満たされるのを待った後に実行を継続するために、ミューテックス ロックと組み合わせて使用​​されます。リーダー/ライター ロック: 複数のスレッドが共有リソースを同時に読み取ることを許可しますが、書き込みを許可するのは 1 つのスレッドのみです。セマフォ: 限られたリソースへのアクセスを制御し、リソースが使用可能になるのを待って解放する機能を提供します。実際のケースでは、ミューテックス ロックを使用してスレッド セーフ キューへのアクセスを保護し、プッシュおよびポップ操作のスレッド セーフを確保できます。

服务器架构中 C++ 线程同步机制的比较和对比

C++ スレッド同期メカニズムの比較

マルチスレッド環境では、スレッド同期メカニズムは、スレッド間の共有リソースへの秩序あるアクセスを保証し、データの競合やデッドロックを防ぐことが重要です。 C++ 言語には、スレッドを同期するためのメカニズムがいくつか用意されていますが、それぞれに独自の長所と短所があります。この記事では、C++ で最も一般的に使用されるスレッド同期メカニズムを比較対照し、実践的な例を示します。

Mutex (ミューテックス)

Mutex は、クリティカル セクションへのアクセスを通じて相互排他を提供し、常に 1 つのスレッドのみがクリティカル セクションにアクセスできるようにします。ミューテックス ロックは、std::mutex クラスを通じて作成できます。 std::mutex 类创建。

// 创建互斥锁
std::mutex m;

// 加锁
m.lock();

// 访问临界区
// ...

// 解锁
m.unlock();

条件变量(Condition Variable)

条件变量用于等待特定条件满足后才继续执行。它通常与互斥锁配合使用,以保证条件检查和状态更新的原子性。

// 创建条件变量
std::condition_variable cv;

// 获取锁
std::mutex m;
m.lock();

// 等待条件满足
while (!condition) {
  cv.wait(m);
}

// 更新状态
// ... 

// 解锁
m.unlock();

读写锁(Reader-Writer Lock)

读写锁允许多个线程同时读取共享资源,但只有单个线程可以写入共享资源。这提高了读取操作的性能,同时保证了写入操作的排他性。C++ 中可以使用 std::shared_mutex 类创建读写锁。

// 创建读写锁
std::shared_mutex rw;

// 获取读锁
rw.lock_shared();

// 读取共享资源
// ...

// 解锁读锁
rw.unlock_shared();

// 获取写锁
rw.lock();

// 写入共享资源
// ...

// 解锁写锁
rw.unlock();

信号量(Semaphore)

信号量是一个同步原语,用于控制对有限资源的访问。它提供了等待资源可用并释放资源的功能。

// 创建信号量,初始值为 3
std::counting_semaphore<3> sem(3);

// 等待资源可用
sem.acquire();

// 使用资源
// ...

// 释放资源
sem.release();

实战案例

线程安全队列

假设我们有一个用于管理任务的线程安全队列。队列的 pushpop

// 线程安全队列类
struct Queue {
  std::mutex m;
  std::queue<int> q;
  
  void push(int value) {
    std::lock_guard<std::mutex> lock(m); // 自动获取和释放锁
    q.push(value);
  }
  
  int pop() {
    std::lock_guard<std::mutex> lock(m);
    if (q.empty()) {
      throw std::runtime_error("队列为空");
    }
    int value = q.front();
    q.pop();
    return value;
  }
};

条件変数

条件変数は、実行を続行する前に特定の条件が満たされるのを待つために使用されます。多くの場合、条件チェックとステータス更新のアトミック性を確保するために、ミューテックス ロックと組み合わせて使用​​されます。 🎜rrreee🎜🎜Reader-Writer Lock🎜🎜🎜Read-Writer Lock を使用すると、複数のスレッドが共有リソースを同時に読み取ることができますが、共有リソースに書き込むことができるのは 1 つのスレッドのみです。これにより、書き込み操作の排他性を確保しながら、読み取り操作のパフォーマンスが向上します。 C++ では、std::shared_mutex クラスを使用して読み取り/書き込みロックを作成できます。 🎜rrreee🎜🎜セマフォ🎜🎜🎜セマフォは、限られたリソースへのアクセスを制御するために使用される同期プリミティブです。リソースが利用可能になるのを待って解放する機能を提供します。 🎜rrreee🎜🎜実際的なケース🎜🎜🎜🎜スレッドセーフキュー🎜🎜🎜タスクを管理するためのスレッドセーフキューがあると仮定します。データ競合を防ぐために、キューの push および pop 操作はスレッドセーフである必要があります。 🎜🎜以下に示すように、ミューテックスを使用してキューへのアクセスを保護できます: 🎜rrreee🎜ミューテックスを使用することにより、常に 1 つのスレッドのみがキューにアクセスできるようになり、スレッドの安全性が確保されます。 🎜

以上がサーバー アーキテクチャにおける C++ スレッド同期メカニズムの比較の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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