在C++中,等待(wait)通常用于線程同步,以確保一個或多個線程在繼續執行之前等待某個條件成立。C++標準庫提供了多種等待機制,如條件變量(condition variables)和互斥鎖(mutexes)。以下是如何使用這些機制來管理等待的示例:
#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>
std::mutex mtx; // 互斥鎖,用于保護共享資源
std::condition_variable cv; // 條件變量,用于線程間的通信
bool ready = false; // 共享資源,表示條件是否滿足
生產者線程函數:
void producer() {
std::unique_lock<std::mutex> lock(mtx); // 加鎖
std::cout << "生產者生產了一個產品\n";
ready = true; // 更新共享資源
cv.notify_one(); // 通知消費者
}
消費者線程函數:
void consumer() {
std::unique_lock<std::mutex> lock(mtx); // 加鎖
cv.wait(lock, []{ return ready; }); // 等待條件滿足
std::cout << "消費者消費了一個產品\n";
}
int main() {
std::thread producer_thread(producer);
std::thread consumer_thread(consumer);
producer_thread.join();
consumer_thread.join();
return 0;
}
在這個示例中,我們使用了std::unique_lock
來自動管理互斥鎖的鎖定和解鎖。當消費者線程調用cv.wait()
時,它會自動釋放互斥鎖并進入等待狀態。當條件滿足時,cv.notify_one()
會喚醒一個等待的線程,消費者線程會繼續執行并重新獲取互斥鎖。
注意:在實際應用中,你可能需要根據具體需求調整線程函數和同步機制。例如,你可以使用cv.notify_all()
來喚醒所有等待的線程,或者使用std::shared_lock
來允許多個線程同時讀取共享資源。