在 C++ 中,std::condition_variable
提供了一種線程間的通信機制,可以用來實現(xiàn)線程同步
下面是一個簡單的示例,展示了如何使用 std::condition_variable
和 std::mutex
實現(xiàn)多線程之間的通知機制:
#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 之后,
}
// 現(xiàn)在線程繼續(xù)執(zhí)行
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;
}
在這個示例中,我們創(chuàng)建了 10 個線程,每個線程都會執(zhí)行 print_id
函數(shù)。這些線程在開始時會獲取互斥鎖并檢查全局變量 ready
是否為 true
。如果 ready
不是 true
,線程將調(diào)用 cv.wait(lck)
進入等待狀態(tài),同時釋放互斥鎖以便其他線程可以獲取該鎖。
主線程調(diào)用 go
函數(shù),該函數(shù)獲取互斥鎖、設置全局變量 ready
為 true
,然后調(diào)用 cv.notify_all()
來喚醒所有等待的線程。注意,在調(diào)用 notify_all()
之前必須擁有互斥鎖,以確保喚醒的線程能夠立即獲取互斥鎖并繼續(xù)執(zhí)行。
這個示例展示了如何使用條件變量和互斥鎖來實現(xiàn)線程間的通知機制。當然,在實際應用中,你可能需要根據(jù)具體情況對代碼進行調(diào)整。