スレッドセーフな同時データ構造設計: 実装方法: アトミック タイプとミューテックス ロック アトミック タイプ: 複数のアクセスが不可分であることを保証し、データの一貫性を確保します。ミューテックス ロック: 同時データ破損を防ぐために、一度に 1 つのスレッドによる共有データへのアクセスを制限します。例: スレッドセーフ キューは、ミューテックス ロックを使用して実装されたスレッドセーフ データ構造を示します。
スレッド セーフとは、データ構造が次のようなものであることを意味します。複数のスレッドで同時にアクセスしても、データの破損やプログラムのクラッシュは発生しません。 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 サイトの他の関連記事を参照してください。