C++ の同時実行制御では、ミューテックス (クリティカル セクションへの 1 回のアクセス)、条件変数 (条件が満たされるのを待機)、読み取り/書き込みロック (複数のリーダーが同時に読み取り可能ですが、書き込みできるのは 1 つだけ) などのメカニズムが使用されます。同時アクセスによって引き起こされる共有リソースのデータ競合と不整合な状態を解決します。
マルチスレッド環境では、共有リソースへの同時アクセスがデータ競合や不整合な状態を引き起こす可能性があります。この問題を解決するために、C++ は同時実行制御を処理するさまざまなメカニズムを提供します。
ミューテックスは、一度に 1 つのスレッドのみがクリティカル セクションにアクセスできるようにする同期プリミティブです。 std::mutex
クラスを使用してミューテックスを作成できます: std::mutex
类来创建一个互斥量:
std::mutex mutex;
要访问临界区,线程必须获取互斥量的锁:
mutex.lock(); // 访问临界区 mutex.unlock();
条件变量是一个同步原语,它允许一个线程等待另一个线程完成特定的条件。我们可以使用 std::condition_variable
类来创建一个条件变量:
std::condition_variable cv;
线程可以通过调用 wait()
方法来等待条件:
cv.wait(mutex);
当条件满足时,另一個執行緒可以呼叫 notify_one()
或 notify_all()
方法來通知等待的執行緒:
cv.notify_one(); cv.notify_all();
读写锁是一种同步原语,它允许多个线程同时读取共享资源,但一次只有一个线程可以写入共享资源。我们可以使用 std::shared_mutex
std::shared_mutex rw_mutex;クリティカル セクションにアクセスするには、スレッドはミューテックスのロックを取得する必要があります:
rw_mutex.lock_shared(); // 读取共享资源 rw_mutex.unlock_shared();条件変数条件変数は、あるスレッドが別のスレッドが特定の条件を完了するまで待機できるようにする同期プリミティブです。
std::condition_variable
クラスを使用して条件変数を作成できます: rw_mutex.lock(); // 写入共享资源 rw_mutex.unlock();
wait()
メソッドを呼び出すことで条件を待機できます: class BankAccount { public: BankAccount(int initial_balance) : balance(initial_balance) {} void deposit(int amount) { balance += amount; } void withdraw(int amount) { if (amount <= balance) { balance -= amount; } } private: int balance; };When条件が満たされた場合、別のスレッドは
notify_one()
または notify_all()
メソッドを呼び出して待機中のスレッドに通知できます: class BankAccount { public: BankAccount(int initial_balance) : balance(initial_balance) {} void deposit(int amount) { std::lock_guard<std::mutex> lock(mutex); balance += amount; } void withdraw(int amount) { std::lock_guard<std::mutex> lock(mutex); if (amount <= balance) { balance -= amount; } } private: std::mutex mutex; int balance; };read-write lockread-write lock は、複数のスレッドが共有リソースから同時に読み取ることを可能にする同期プリミティブですが、一度に 1 つのスレッドのみが共有リソースに書き込むことができます。
std::shared_mutex
クラスを使用して、読み取り/書き込みロックを作成できます: 🎜rrreee🎜 共有リソースを読み取るために、スレッドは読み取りロックを取得できます: 🎜rrreee🎜 共有リソースに書き込むために、スレッドは書き込みを取得できますロック:🎜rrreee🎜実際的なケース🎜🎜 残高メンバー変数と入出金のメソッドを含む単純な銀行口座クラスを考えてみましょう:🎜rrreee🎜 同時アクセスを処理するには、ミューテックスを使用して残高メンバー変数を保護できます: 🎜 rrreee🎜 これで、複数のスレッドから同時に銀行口座に安全にアクセスできるようになりました。 🎜以上がC++ クラス設計で同時実行制御をどのように扱うか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。