C++でのマルチスレッドでのデータ共有の実装方法は何ですか?
C++では、複数スレッドで共有データを実装する際には、mutexと条件変数を使用できます。
共有データを保護するために排他ロックを使用し、いつでも1つのスレッドだけが共有データにアクセスできるようにします。スレッドが共有データにアクセスする際には、排他ロックを取得してから共有データへのアクセスが終わったら排他ロックを解放し、他のスレッドが続けてアクセスできるようにします。
条件変数は、スレッド間の同期や通信に使用されます。条件変数を使うと、あるスレッドは条件が満たされるまで待機することができ、別のスレッドはシグナルを送信して待機中のスレッドに条件が満たされたことを通知することができます。通常、条件変数はミューテックスと一緒に使用され、競合状態が発生しないように条件を待つことが保証されます。
以下は、マルチスレッドでデータを共有するためにミューテックスと条件変数を使用する方法を示したサンプルコードです。
#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>
std::mutex mtx; // 互斥锁
std::condition_variable cv; // 条件变量
int sharedData = 0; // 共享数据
void worker(int id) {
std::unique_lock<std::mutex> lock(mtx); // 获取互斥锁
// 等待共享数据被更新为指定值
cv.wait(lock, []{ return sharedData == 42; });
// 访问共享数据
std::cout << "Thread " << id << ": Shared data = " << sharedData << std::endl;
// 释放互斥锁
lock.unlock();
}
int main() {
std::thread t1(worker, 1);
std::thread t2(worker, 2);
// 更新共享数据
std::this_thread::sleep_for(std::chrono::seconds(2)); // 模拟一段耗时操作
{
std::lock_guard<std::mutex> lock(mtx); // 获取互斥锁
sharedData = 42;
// 通知等待的线程条件已经成立
cv.notify_all();
}
t1.join();
t2.join();
return 0;
}
この例では、共有データが指定された値(42)に更新されるのを待っている2つのスレッド(t1とt2)があります。メインスレッドは一定時間待った後に共有データを更新し、待機中のスレッドに条件が成立したことを通知します。待機中のスレッドが再びmutexを取得して共有データにアクセスします。
互斥ロックと条件変数の使用はペアで行う必要があり、条件を待つ際には同じ互斥ロックを使用する必要があります。また、互斥ロックと条件変数を使用する際には、デッドロックや競合状態の発生を避けるために、スレッドの実行順序や操作を慎重に設計し調整する必要があります。