condition_variable 類是同步原語,能用於阻塞乙個執行緒,或同時阻塞多個執行緒,直至另一線程修改共享變數(條件)並通知 condition_variable 。
有意修改變數的執行緒必須
獲得 std::mutex (常通過 std::lock_guard )
在保有鎖時進行修改
在 std::condition_variable 上執行 notify_one 或 notify_all(不需要為通知保有鎖)
即使共享變數是原子的,也必須在互斥下修改它,以正確地發布修改到等待的執行緒。
任何有意在 std::condition_variable 上等待的執行緒必須
在與用於保護共享變數者相同的互斥上獲得 std::unique_lockstd::mutex
執行下列之一:
std::condition_variable 只可與 std::unique_lockstd::mutex 一同使用;此限制在一些平台上允許最大效率。 std::condition_variable_any 提供可與任何基本可鎖定 (basiclockable) 物件,例如 std::shared_lock 一同使用的條件變數。
condition_variable 容許 wait 、 wait_for 、 wait_until 、 notify_one 及 notify_all 成員函式的同時呼叫。
類 std::condition_variable 是標準布局型別 (standardlayouttype) 。它非可複製構造 (copyconstructible) 、可移動構造 (moveconstructible) 、可複製賦值 (copyassignable) 或可移動賦值 (moveassignable) 。
成員型別 定義
native_handle_type 實現定義
成員函式
(建構函式)構造物件(公開成員函式)
(析構函式) 析構物件(公開成員函式)
operator= [被刪除]不可複製賦值(公開成員函式)
通知 notify_one 通知乙個等待的執行緒(公開成員函式)
notify_all 通知所有等待的執行緒(公開成員函式)
等待 wait 阻塞當前執行緒,直到條件變數被喚醒(公開成員函式)
wait_for 阻塞當前執行緒,直到條件變數被喚醒,或到指定時限時長後(公開成員函式)
wait_until 阻塞當前執行緒,直到條件變數被喚醒,或直到抵達指定時間點(公開成員函式)
原生控制代碼
native_handle 返回原生控制代碼(公開成員函式)
#include #include #include #include #include std::mutex m;
std::condition_variable cv;
std::string data;
bool ready = false;
bool processed = false;
void worker_thread());
// 等待後,我們占有鎖。
std::cout << "worker thread is processing data\n";
data += " after processing";
// 傳送資料回 main()
processed = true;
std::cout << "worker thread signals data processing completed\n";
// 通知前完成手動解鎖,以避免等待執行緒才被喚醒就阻塞(細節見 notify_one )
lk.unlock();
cv.notify_one();}
int main()
cv.notify_one();
// 等候 worker);}
std::cout << "back in main(), data = " << data << '\n';
worker.join();
}
輸出:
main() signals data ready for processing
worker thread is processing data
worker thread signals data processing completed
back in main(), data = example data after processing
condition_variable_any 類是 std::condition_variable 的泛化。相對於只在 std::unique_lock< std::mutex> 上工作的 std::condition_variable , condition_variable_any 能在任何滿足基本可鎖定 (basiclockable) 要求的鎖上工作。
類 std::condition_variable_any 是標準布局型別 (standardlayouttype) 。它非可複製構造 (copyconstructible) 、可移動構造 (moveconstructible) 、可複製賦值 (copyassignable) 或可移動賦值 (moveassignable) 。
若鎖是 std::unique_lock ,則 std::condition_variable 可能提供更好的效能。
成員函式
(建構函式) 構造物件(公開成員函式)
(析構函式) 析構物件(公開成員函式)
operator=[被刪除] 不可複製賦值(公開成員函式)
通知 notify_one 通知乙個等待的執行緒(公開成員函式)
notify_all 通知所有等待的執行緒(公開成員函式)
等待 wait 阻塞當前執行緒,直到條件變數被喚醒(公開成員函式)
wait_for 阻塞當前執行緒,直到條件變數被喚醒,或到指定時限時長後(公開成員函式)
wait_until 阻塞當前執行緒,直到條件變數被喚醒,或直到抵達指定時間點(公開成員函式)
註解 std::condition_variable_any 能與 std::shared_lock 一同使用,以在 std::shared_mutex 上以共享所有權模式等待。
std::condition_variable_any 與定製可鎖定 (lockable) 型別的一種可行使用是提供便利的可中斷等待:定製所操作將按期待鎖定關聯互斥,並在收到中斷訊號時進行必要的設定,以通知此條件變數。
C 條件變數
1.作用 在c 11中,我們可以使用條件變數 std condition variable 實現多個執行緒間的同步操作 當條件不滿足時,相關執行緒被一直阻塞,並釋放cpu,直到某種條件出現,這些執行緒才會被喚醒。條件變數需要和互斥量 鎖 一起搭配使用。用在多執行緒中。執行緒a 等待乙個條件滿足 執行...
c 之條件變數
條件變數是允許多個執行緒相互交流的同步原語。它允許一定量的執行緒等待 可以定時 另一線程的提醒,然後再繼續。條件變數始終關聯到乙個互斥。定義於標頭檔案 condition variable 提供與 std unique lock 關聯的條件變數 condition variable any 提供與任...
c 執行緒條件變數
此處有兩個執行緒,乙個作為生產者,把資料放入佇列中,乙個作為消費者,把資料從佇列中取出,所以對兩個執行緒而言,這個佇列是共用的,所以要加鎖進行保護。include stdafx.h include include include include include using namespace std...