C++中的條件變量是一種非常有用的同步原語,它允許線程等待某個條件成立,同時釋放互斥鎖以便其他線程可以繼續執行
std::unique_lock
和std::condition_variable
:在調用std::condition_variable::wait()
之前,確保已經創建了一個std::unique_lock
對象并鎖定了相關的互斥量。這樣可以確保在等待條件成立時,互斥量被正確釋放。std::unique_lock<std::mutex> lock(mutex_);
condition_.wait(lock, []{ return condition_; });
while (!condition_) {
std::unique_lock<std::mutex> lock(mutex_);
condition_.wait(lock);
}
std::cv_status
檢查等待狀態:在喚醒等待的線程后,可以使用std::condition_variable::wait_for()
或std::condition_variable::wait_until()
函數檢查線程是否應該繼續執行。這些函數返回一個std::cv_status
枚舉值,可以根據返回值判斷線程是否因超時而返回。std::unique_lock<std::mutex> lock(mutex_);
if (condition_.wait_for(lock, std::chrono::seconds(1)) == std::cv_status::timeout) {
// 處理超時情況
} else {
// 條件已滿足,繼續執行
}
std::condition_variable::notify_one()
和std::condition_variable::notify_all()
:當條件滿足時,可以使用這兩個函數喚醒等待的線程。notify_one()
只喚醒一個等待的線程,而notify_all()
會喚醒所有等待的線程。注意,喚醒線程后,它們需要重新獲取互斥量并檢查條件是否滿足。{
std::unique_lock<std::mutex> lock(mutex_);
condition_ = true;
condition_.notify_one(); // 或 condition_.notify_all();
}
// 在其他線程中
std::unique_lock<std::mutex> lock(mutex_);
condition_.wait(lock, []{ return condition_; });
減少鎖的持有時間:在調用std::condition_variable::wait()
之前,盡量將需要保護的數據操作集中在一個作用域內,以減少鎖的持有時間。這樣可以降低其他線程等待鎖的時間,提高程序性能。
使用std::shared_mutex
允許多個線程同時讀取:如果你的條件變量用于保護共享數據,并且允許多個線程同時讀取數據,可以使用std::shared_mutex
代替std::mutex
。這樣,在讀取數據的線程可以持有共享鎖,而寫入數據的線程需要持有獨占鎖。
總之,在使用C++條件變量時,需要注意避免虛假喚醒、合理使用鎖和條件變量、減少鎖的持有時間等技巧,以提高程序的性能和可靠性。