ホームページ  >  記事  >  バックエンド開発  >  C++ 同時プログラミング: 同時データ構造のスレッドセーフ設計を実行するにはどうすればよいですか?

C++ 同時プログラミング: 同時データ構造のスレッドセーフ設計を実行するにはどうすればよいですか?

WBOY
WBOYオリジナル
2024-05-03 17:15:01812ブラウズ

スレッドセーフな同時データ構造設計: 実装方法: アトミック タイプとミューテックス ロック アトミック タイプ: 複数のアクセスが不可分であることを保証し、データの一貫性を確保します。ミューテックス ロック: 同時データ破損を防ぐために、一度に 1 つのスレッドによる共有データへのアクセスを制限します。例: スレッドセーフ キューは、ミューテックス ロックを使用して実装されたスレッドセーフ データ構造を示します。

C++ 同時プログラミング: 同時データ構造のスレッドセーフ設計を実行するにはどうすればよいですか?

C 同時プログラミング: スレッド セーフな同時データ構造設計

スレッド セーフについて理解

スレッド セーフとは、データ構造が次のようなものであることを意味します。複数のスレッドで同時にアクセスしても、データの破損やプログラムのクラッシュは発生しません。 C 同時プログラミングでは、スレッド セーフを実現することが重要です。

アトミック タイプとミューテックス ロック

アトミック タイプ:
アトミック タイプは、基になるデータへの複数のアクセスが不可分であることを保証し、一貫性を保証します。たとえば、std::atomic<int></int>

ミューテックス ロック:
ミューテックス ロックを使用すると、一度に 1 つのスレッドが共有データにアクセスできるため、同時アクセスによるデータの破損を防ぐことができます。 std::mutex を使用します。

例: スレッド セーフ キュー

次は、ミューテックスを使用して実装された単純なスレッド セーフ キューです:

#include <iostream>
#include <mutex>
#include <queue>

class ThreadSafeQueue {
private:
    std::queue<int> data;
    std::mutex mtx;

public:
    void push(int value) {
        std::lock_guard<std::mutex> lock(mtx);
        data.push(value);
    }

    int pop() {
        std::lock_guard<std::mutex> lock(mtx);
        if (data.empty()) throw std::runtime_error("Queue is empty");
        int value = data.front();
        data.pop();
        return value;
    }

    bool empty() {
        std::lock_guard<std::mutex> lock(mtx);
        return data.empty();
    }
};

int main() {
    ThreadSafeQueue queue;

    std::thread t1([&queue] {
        for (int i = 0; i < 1000; ++i) {
            std::lock_guard<std::mutex> lock(queue.mtx);
            queue.push(i);
        }
    });

    std::thread t2([&queue] {
        while (!queue.empty()) {
            std::lock_guard<std::mutex> lock(queue.mtx);
            std::cout << "Thread 2 popped: " << queue.pop() << std::endl;
        }
    });

    t1.join();
    t2.join();

    return 0;
}

この例では:

  • std::mutex キュー データへの同時アクセスを保護するために使用されます。
  • std::lock_guard キューの重要な部分に入るときにミューテックスをロックし、キューから出るときにロックを解除するために使用されます。
  • 複数のスレッドは、データを同時にキューに安全にプッシュおよびポップできます。

結論

スレッドセーフな同時データ構造の実装は、C での同時プログラミングの重要な側面です。アトミック タイプやミューテックス ロックなどのメカニズムを使用することで、データの一貫性を確保し、同時アクセスによるデータの破損やプログラムのクラッシュを防ぐことができます。

以上がC++ 同時プログラミング: 同時データ構造のスレッドセーフ設計を実行するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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