C におけるマルチスレッド同期の問題の詳細な説明
同時プログラミングでは、マルチスレッド同期は重要な問題です。複数のスレッドが共有リソースに同時にアクセスすると、競合状態、デッドロック、ライブロックなどのさまざまな問題が発生し、プログラムの不確実性やエラーにつながります。
C は、マルチスレッド同期の問題を処理するためのさまざまなメカニズムを提供します。この記事では、一般的に使用されるいくつかの同期メカニズムを詳しく紹介し、具体的なコード例を示します。
std::mutex
クラスの lock()
メソッドと unlock()
メソッドを呼び出すことで、共有リソースへのアクセスを保護できます。 次に、ミューテックス ロックを使用して共有リソースを保護するサンプル コードを示します。
#include <iostream> #include <thread> #include <mutex> std::mutex mtx; int shared_data = 0; void increment_shared_data() { std::lock_guard<std::mutex> lock(mtx); shared_data++; } int main() { std::thread t1(increment_shared_data); std::thread t2(increment_shared_data); t1.join(); t2.join(); std::cout << "shared_data = " << shared_data << std::endl; return 0; }
上記のコードでは、std::lock_guard
クラスは次のとおりです。 used ミューテックス ロックを自動的にロックおよびロック解除します。これにより、共有リソースにアクセスするときにクリティカル セクションに入ることができるスレッドは 1 つだけになります。
以下は、条件変数を使用してプロデューサーとコンシューマーの問題を実装するサンプル コードです:
#include <iostream> #include <thread> #include <mutex> #include <condition_variable> #include <queue> std::mutex mtx; std::condition_variable cv; std::queue<int> data_queue; void producer() { for (int i = 0; i < 10; i++) { { std::lock_guard<std::mutex> lock(mtx); data_queue.push(i); } cv.notify_one(); } } void consumer() { while (true) { std::unique_lock<std::mutex> lock(mtx); cv.wait(lock, [] { return !data_queue.empty(); }); int data = data_queue.front(); data_queue.pop(); lock.unlock(); std::cout << "Consumer: " << data << std::endl; } } int main() { std::thread prod(producer); std::thread cons(consumer); prod.join(); cons.join(); return 0; }
この例では、プロデューサー スレッドはキューにデータを継続的に追加し、コンシューマ スレッドはキューからデータを取得して処理します。キューが空の場合、コンシューマ スレッドは条件が満たされるまで待機します。
<atomic></atomic>
が導入されました。これは、std::atomic_int
などのいくつかのアトミック タイプを定義します。 以下は、アトミック操作を使用してスレッドセーフ カウンターを実装するサンプル コードです。
#include <iostream> #include <thread> #include <atomic> std::atomic_int counter(0); void increment_counter() { counter++; } int main() { std::thread t1(increment_counter); std::thread t2(increment_counter); t1.join(); t2.join(); std::cout << "counter = " << counter << std::endl; return 0; }
上記のコードでは、std::atomic_int
type ##counter変数は複数のスレッドによって同時に安全にアクセスおよび変更でき、カウンタの正確性が保証されます。
厳密なマルチスレッド同期は、並行プログラミングの中核的な問題です。C は、マルチスレッド同期の問題を処理するために、ミューテックス ロック、条件変数、アトミック操作などの複数のメカニズムを提供します。適切な同期方法を合理的に選択し、これらのメカニズムを正しく使用すると、さまざまな同時実行性の問題の発生を効果的に回避できます。
以上がC++ におけるマルチスレッド同期の問題の詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。