ホームページ  >  記事  >  バックエンド開発  >  C++ でスレッド セーフを実装するにはどうすればよいですか?

C++ でスレッド セーフを実装するにはどうすればよいですか?

WBOY
WBOYオリジナル
2024-06-03 13:36:56685ブラウズ

マルチスレッド環境では、データの破損を避けるためにスレッド セーフを実装することが重要です。 C++ では次のメカニズムが提供されます。 1. ミューテックス ロック (std::mutex) により、一度に 1 つのスレッドのみが共有データにアクセスできるようになります。 2. 条件変数 (std::condition_variable) により、スレッドは特定の値を待機できます。条件が true であること。 3. 読み取り/書き込みロック (std::shared_mutex) により、複数のスレッドが共有データを同時に読み取ることができますが、書き込みできるのは 1 つのスレッドだけです。これらのメカニズムは、異なるスレッドによる共有リソースへのアクセスを同期することにより、マルチスレッド環境におけるプログラムの安定性とデータの整合性を保証します。

C++ でスレッド セーフを実装するにはどうすればよいですか?

C++ でのスレッドセーフな実装

はじめに

マルチスレッド環境では、複数のスレッドが同期せずに共有データに同時にアクセスすると、データの破損やアプリケーションのクラッシュが発生する可能性があります。このような問題を防ぐには、スレッド セーフを実装する必要があります。

ミューテックス ロック

ミューテックス ロックは、一度に 1 つのスレッドのみがコードまたはデータの特定の部分にアクセスできるようにする同期プリミティブです。 C++ では、以下に示すように、std::mutex を使用してミューテックス ロックを作成できます: std::mutex 来创建互斥锁,如下所示:

std::mutex m;

要获取互斥锁,请使用 lock() 方法:

m.lock();

当不再需要时释放互斥锁:

m.unlock();

互斥锁的优点是简单易用,但缺点是如果一个线程长时间持有互斥锁,则其他线程可能需要很长时间才能获得互斥锁。

条件变量

条件变量与互斥锁一起使用,允许线程等待某个条件变为真。在 C++ 中,可以使用 std::condition_variable 来创建条件变量,如下所示:

std::condition_variable cv;

要等待条件变量,请使用 wait() 方法,如下所示:

m.lock();
cv.wait(m);
m.unlock();

这将使线程进入休眠状态,直到另一个线程使用 cv.notify_one()cv.notify_all() 唤醒它。

读写锁

读写锁是一种特殊的互斥锁,它允许多个线程同时读取共享数据,但一次只能允许一个线程写入共享数据。在 C++ 中,可以使用 std::shared_mutex 来创建读写锁,如下所示:

std::shared_mutex rw;

要获取读锁,请使用 lock_shared() 方法:

rw.lock_shared();

要获取写锁,请使用 lock()

rw.lock();

ミューテックス ロックを取得するには、lock() メソッドを使用します。

class BankAccount {
    std::mutex m;
    std::condition_variable cv;
    int balance;

public:
    int get_balance() {
        m.lock();
        int b = balance;
        m.unlock();
        return b;
    }

    void deposit(int amount) {
        m.lock();
        balance += amount;
        cv.notify_all();
        m.unlock();
    }

    void withdraw(int amount) {
        m.lock();
        while (balance < amount) {
            cv.wait(m);
        }
        balance -= amount;
        m.unlock();
    }
};
不要になったらミューテックスを解放します: rrreee

ミューテックスの利点は、シンプルで使いやすいことですが、欠点は、1 つのスレッドがミューテックスを長時間保持すると、時間がかかる可能性があることです。他のスレッドがミューテックス ロックを取得するまでの時間。

条件変数

🎜🎜 条件変数は、スレッドが特定の条件が true になるまで待機できるようにするために、ミューテックス ロックとともに使用されます。 C++ では、以下に示すように std::condition_variable を使用して条件変数を作成できます: 🎜rrreee🎜 条件変数を待機するには、次のように wait() メソッドを使用します。以下は次のことを示します: 🎜rrreee🎜 これにより、別のスレッドが cv.notify_one() または cv.notify_all() を使用してウェイクアップするまで、スレッドはスリープ状態になります。 🎜🎜🎜読み取り/書き込みロック🎜🎜🎜読み取り/書き込みロックは、複数のスレッドが同時に共有データを読み取ることを許可しますが、一度に 1 つのスレッドのみが共有データを書き込むことを許可する特別なミューテックス ロックです。 C++ では、以下に示すように、std::shared_mutex を使用して読み取り/書き込みロックを作成できます: 🎜rrreee🎜 読み取りロックを取得するには、lock_shared() を使用します。メソッド: 🎜 rrreee🎜 書き込みロックを取得するには、lock() メソッドを使用します: 🎜rrreee🎜🎜実際的な例🎜🎜🎜 口座残高を追跡する銀行口座クラスがあるとします: 🎜rrreee🎜この例では、ミューテックスを使用して残高変数を保護し、条件変数を使用して残高が引き出しを満たすのに不十分な場合にスレッドが待機できるようにします。 🎜

以上がC++ でスレッド セーフを実装するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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