C 関数でスレッドセーフなデータ構造を実装するにはどうすればよいですか?ミューテックス ロックを使用して重要なセクション (共有データ) を保護します。スレッドセーフな動的配列の例: ミューテックスを使用して std::vector 内のデータを保護します。実際のケース: スレッド セーフ キュー。ミューテックス ロックと条件変数を使用して、メッセージ キューのスレッド セーフを実現します。
#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 サイトの他の関連記事を参照してください。