在C++中,共享數據的多線程實現可以使用互斥鎖(mutex)和條件變量(condition variable)來實現。
互斥鎖用于保護共享數據,確保在任意時刻只有一個線程可以訪問共享數據。當一個線程要訪問共享數據時,它需要先獲取互斥鎖,然后在訪問完共享數據后釋放互斥鎖,以便其他線程可以繼續訪問。
條件變量用于線程之間的同步和通信。一個線程可以通過等待條件變量來等待某個條件成立,而另一個線程可以通過發出信號來通知等待的線程條件已經成立。條件變量通常與互斥鎖一起使用,以保證在等待條件時不會出現競態條件。
下面是一個示例代碼,演示了如何使用互斥鎖和條件變量實現多線程共享數據的方式:
#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;
}
在這個示例中,有兩個線程(t1
和t2
)等待共享數據被更新為指定值(42
)。主線程在等待一段時間后更新共享數據,并通知等待的線程條件已經成立。等待的線程被喚醒后會再次獲取互斥鎖并訪問共享數據。
需要注意的是,互斥鎖和條件變量的使用必須是配對的,即在等待條件時必須使用相同的互斥鎖。另外,使用互斥鎖和條件變量時要避免死鎖和競態條件的發生,需要仔細設計和調整線程的執行順序和操作。