<condition_variable>
定義 condition_variable 和 condition_variable_any 類別,以用來建立等候條件為 True 時的物件。
此標頭使用並行執行階段 (ConcRT),因此您可以搭配使用其他 ConcRT 機制。 如需有關 ConcRT 的詳細資訊,請參閱並行執行階段。
需求
標頭:<condition_variable>
命名空間:std
注意
在使用 /clr 編譯的程序代碼中,會封鎖此標頭。
備註
等候條件變數的程式碼也必須使用 mutex
。 呼叫端執行緒必須先鎖定 mutex
之後,才能呼叫等候條件變數的函數。 傳回呼叫的函數時,便會鎖定 mutex
。 當執行緒等候條件為 True 時,不會鎖定 mutex
。 由於每個等候條件變數的執行緒皆必須使用相同的 mutex
物件,因此不會發生未預期的結果。
任何類型的 Mutex 皆可搭配使用 condition_variable_any
類型的物件。 所使用的 Mutex 類型不需要提供 try_lock
方法。 unique_lock<mutex>
類型的 Mutex 僅可搭配使用 condition_variable
類型的物件。 此類型的物件可能會比 condition_variable_any<unique_lock<mutex>>
類型的物件更快。
若要等候事件,請先鎖定 Mutex,然後呼叫條件變數上的其中一個 wait
方法。 wait
呼叫會受到封鎖,直到其他執行緒通知條件變數為止。
未經適當通知就解除封鎖等候條件變數的執行緒時,會發生「假喚醒」的情況。 若要辨識這類假喚醒,等候條件為 True 的程式碼應在 wait 函式傳回程式碼時,明確檢查該項條件。 上述作業通常是透過使用迴圈來完成,因此您可以使用 wait(unique_lock<mutex>& lock, Predicate pred)
來執行這個迴圈。
while (condition is false)
wait for condition variable;
condition_variable_any
和 condition_variable
類別都有三種等候條件的方法。
wait
會等候無限制的時間週期。wait_until
會等候到指定的time
為止。wait_for
會等候指定的time interval
。
每種方法皆有兩個多載的版本。 其中一個只會等待,並可能會假喚醒。 另一個則會使用述詞中定義的其他範本引數。 要等到述詞為 true
之後,才會傳回方法。
每個類別也有兩種方法,用來在其條件為 true
時通知條件變數。
notify_one
會喚醒正在等候條件變數的其中一個執行緒。notify_all
會喚醒正在等候條件變數的所有執行緒。
函式和列舉
void notify_all_at_thread_exit(condition_variable& cond, unique_lock<mutex> lk);
enum class cv_status { no_timeout, timeout };