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