在 C++ 中,std::condition_variable
提供了一種線程間的通信機制,可以用來實現線程同步
下面是一個簡單的示例,展示了如何使用 std::condition_variable
和 std::mutex
實現多線程之間的通知機制:
#include<iostream>
#include<thread>
#include <mutex>
#include<condition_variable>
std::mutex mtx;
std::condition_variable cv;
bool ready = false;
void print_id(int id) {
std::unique_lock<std::mutex> lck(mtx);
while (!ready) { // 如果 ready 為 false, 則等待
cv.wait(lck); // 當前線程被阻塞, 當全局變量 ready 變成 true 之后,
}
// 現在線程繼續執行
std::cout << "thread " << id << '\n';
}
void go() {
std::unique_lock<std::mutex> lck(mtx);
ready = true; // 修改全局變量
cv.notify_all(); // 喚醒所有線程
}
int main() {
std::thread threads[10];
// spawn 10 threads:
for (int i = 0; i < 10; ++i)
threads[i] = std::thread(print_id, i);
std::cout << "10 threads ready to race...\n";
go(); // go!
for (auto &th : threads) th.join();
return 0;
}
在這個示例中,我們創建了 10 個線程,每個線程都會執行 print_id
函數。這些線程在開始時會獲取互斥鎖并檢查全局變量 ready
是否為 true
。如果 ready
不是 true
,線程將調用 cv.wait(lck)
進入等待狀態,同時釋放互斥鎖以便其他線程可以獲取該鎖。
主線程調用 go
函數,該函數獲取互斥鎖、設置全局變量 ready
為 true
,然后調用 cv.notify_all()
來喚醒所有等待的線程。注意,在調用 notify_all()
之前必須擁有互斥鎖,以確保喚醒的線程能夠立即獲取互斥鎖并繼續執行。
這個示例展示了如何使用條件變量和互斥鎖來實現線程間的通知機制。當然,在實際應用中,你可能需要根據具體情況對代碼進行調整。