C 條件變數

2022-10-02 12:42:08 字數 3215 閱讀 3650

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...