ホームページ > バックエンド開発 > C++ > C++ クラス設計で同時実行制御をどのように扱うか?

C++ クラス設計で同時実行制御をどのように扱うか?

WBOY
リリース: 2024-06-02 21:20:01
オリジナル
336 人が閲覧しました

C++ の同時実行制御では、ミューテックス (クリティカル セクションへの 1 回のアクセス)、条件変数 (条件が満たされるのを待機)、読み取り/書き込みロック (複数のリーダーが同時に読み取り可能ですが、書き込みできるのは 1 つだけ) などのメカニズムが使用されます。同時アクセスによって引き起こされる共有リソースのデータ競合と不整合な状態を解決します。

C++ クラス設計で同時実行制御をどのように扱うか?

C++ クラス設計における同時実行制御

はじめに

マルチスレッド環境では、共有リソースへの同時アクセスがデータ競合や不整合な状態を引き起こす可能性があります。この問題を解決するために、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 lock

read-write lock は、複数のスレッドが共有リソースから同時に読み取ることを可能にする同期プリミティブですが、一度に 1 つのスレッドのみが共有リソースに書き込むことができます。 std::shared_mutex クラスを使用して、読み取り/書き込みロックを作成できます: 🎜rrreee🎜 共有リソースを読み取るために、スレッドは読み取りロックを取得できます: 🎜rrreee🎜 共有リソースに書き込むために、スレッドは書き込みを取得できますロック:🎜rrreee🎜実際的なケース🎜🎜 残高メンバー変数と入出金のメソッドを含む単純な銀行口座クラスを考えてみましょう:🎜rrreee🎜 同時アクセスを処理するには、ミューテックスを使用して残高メンバー変数を保護できます: 🎜 rrreee🎜 これで、複数のスレッドから同時に銀行口座に安全にアクセスできるようになりました。 🎜

以上がC++ クラス設計で同時実行制御をどのように扱うか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート