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

C++ 関数でスレッドセーフなデータ構造を実装するにはどうすればよいですか?

王林
王林オリジナル
2024-04-27 08:33:02763ブラウズ

C 関数でスレッドセーフなデータ構造を実装するにはどうすればよいですか?ミューテックス ロックを使用して重要なセクション (共有データ) を保護します。スレッドセーフな動的配列の例: ミューテックスを使用して std::vector 内のデータを保護します。実際のケース: スレッド セーフ キュー。ミューテックス ロックと条件変数を使用して、メッセージ キューのスレッド セーフを実現します。

如何在 C++ 函数中实现线程安全的数据结构?

#C 関数でスレッドセーフなデータ構造を実装するにはどうすればよいですか?

マルチスレッド アプリケーションでは、共有データへの同時アクセスが競合状態やデータ破損を引き起こす可能性があります。したがって、共有データ構造をスレッドセーフにして、各スレッドが安全にデータにアクセスして変更できるようにすることが重要です。

スレッドセーフなデータ構造を実装する簡単な方法は、ミューテックス ロックを使用することです。ミューテックスは、一度に 1 つのスレッドのみがクリティカル セクション (共有データ) にアクセスできるようにする同期プリミティブです。次のコード例は、ミューテックス ロックを使用して動的配列内のデータを保護する方法を示しています。

#include <mutex>
#include <vector>

std::mutex m;

// 线程安全的动态数组
class ThreadSafeVector {
public:
    void push_back(int value) {
        std::lock_guard<std::mutex> lock(m);
        v.push_back(value);
    }
    
    int get(size_t index) {
        std::lock_guard<std::mutex> lock(m);
        return v[index];
    }

private:
    std::vector<int> v;
};

int main() {
    ThreadSafeVector v;
    v.push_back(1);
    int value = v.get(0);
    // ...
}

この例では、std::lock_guard が RAII として使用されます (リソースの取得は初期化です)。 ) ラッパー。クリティカル セクションに入るときにミューテックス ロックを自動的に取得し、クリティカル セクションから出るときにミューテックス ロックを自動的に解放します。これにより、一度に 1 つのスレッドだけが v ベクトルにアクセスできるようになります。

実践的なケース: スレッド セーフ キュー

マルチスレッド アプリケーションがあり、スレッドがメッセージ キューを共有する必要があるとします。キューをスレッドセーフにするには、ミューテックスと条件変数を使用してこれを実現できます。

#include <mutex>
#include <condition_variable>
#include <queue>

std::mutex m;
std::condition_variable cv;

class ThreadSafeQueue {
public:
    void push(int value) {
        std::lock_guard<std::mutex> lock(m);
        q.push(value);
        cv.notify_one();
    }
    
    int pop() {
        std::unique_lock<std::mutex> lock(m);
        cv.wait(lock, [this]{ return !q.empty(); });
        int value = q.front();
        q.pop();
        return value;
    }

private:
    std::queue<int> q;
};

int main() {
    ThreadSafeQueue q;
    // ...
}

この場合、std::condition_variable を使用して、スレッドが存在するかどうかをスレッドに通知します。キューの新しい情報。 std::unique_lock は、ミューテックスのロックとロック解除に使用され、キューに新しいメッセージができるまで cv.wait() メソッドを通じてスレッドをスリープ状態にすることもできます。

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

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