在C++中,可以使用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); // 當前線程被阻塞,等待條件變量被通知
}
// 現在線程繼續執行
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
變量。如果ready
為false
,線程將調用cv.wait(lck)
進入等待狀態,此時線程會釋放互斥鎖并被阻塞。當go
函數被調用時,ready
變量被設置為true
,并調用cv.notify_all()
喚醒所有等待的線程。一旦線程收到通知,它將重新獲取互斥鎖并繼續執行。