condition_variable 類別
當您具有 unique_lock<mutex>
類型的 mutex
時,可使用 condition_variable
類別來等候事件。 此類型的物件效能可能比類型condition_variable_any unique_lock<<mutex>> 的物件更好。
語法
class condition_variable;
成員
建構函式
名稱 | 描述 |
---|---|
condition_variable | 建構 condition_variable 物件。 |
函式
名稱 | 描述 |
---|---|
native_handle | 傳回代表 condition_variable 控制代碼的實作特定類型。 |
notify_all | 解除封鎖所有等候 condition_variable 物件的執行緒。 |
notify_one | 解除封鎖其中一個等候 condition_variable 物件的執行緒。 |
等 | 封鎖執行緒。 |
wait_for | 封鎖執行緒,並設定要在多久時間間隔之後解除封鎖執行緒。 |
wait_until | 封鎖執行緒,並設定要解除封鎖執行緒的時間點上限。 |
condition_variable
建構 condition_variable
物件。
condition_variable();
備註
如果可用的記憶體不足,建構函式會擲回具有 not_enough_memory
錯誤碼的 system_error 物件。 如果因為無法使用其他部分資源,而無法建構物件,建構函式會擲回具有 resource_unavailable_try_again
錯誤碼的 system_error
物件。
native_handle
傳回代表 condition_variable 控制代碼的實作特定類型。
native_handle_type native_handle();
傳回值
系統會將 native_handle_type
定義為並行執行階段內部資料結構的指標。
notify_all
解除封鎖所有等候 condition_variable
物件的執行緒。
void notify_all() noexcept;
notify_one
解除封鎖其中一個等候 condition_variable
物件的執行緒。
void notify_one() noexcept;
wait
封鎖執行緒。
void wait(unique_lock<mutex>& Lck);
template <class Predicate>
void wait(unique_lock<mutex>& Lck, Predicate Pred);
參數
Lck
<unique_lock mutex> 物件。
Pred
傳回 true
或 false
的任何運算式。
備註
系統會封鎖第一個方法,直到 condition_variable
物件收到 notify_one 或 notify_all 的呼叫訊號為止。 它也可能會假性喚醒。
而第二種方法會執行下列程式碼。
while(!Pred())
wait(Lck);
wait_for
封鎖執行緒,並設定要在多久時間間隔之後解除封鎖執行緒。
template <class Rep, class Period>
cv_status wait_for(
unique_lock<mutex>& Lck,
const chrono::duration<Rep, Period>& Rel_time);
template <class Rep, class Period, class Predicate>
bool wait_for(
unique_lock<mutex>& Lck,
const chrono::duration<Rep, Period>& Rel_time,
Predicate Pred);
參數
Lck
<unique_lock mutex> 物件。
Rel_time
chrono::duration
物件,指定喚醒執行緒之前的時間。
Pred
傳回 true
或 false
的任何運算式。
傳回值
如果等候在經過Rel_time時終止,則第一個方法會傳回 cv_status::timeout
。 否則,方法會傳回 cv_status::no_timeout
。
第二個方法會傳回 Pred 的值。
備註
第一個方法會封鎖物件,直到 condition_variable
呼叫 notify_one 或 notify_all ,或直到時間間隔 Rel_time 經過為止。 它也可能會假性喚醒。
而第二種方法會執行下列程式碼。
while(!Pred())
if(wait_for(Lck, Rel_time) == cv_status::timeout)
return Pred();
return true;
wait_until
封鎖執行緒,並設定要解除封鎖執行緒的時間點上限。
template <class Clock, class Duration>
cv_status wait_until(
unique_lock<mutex>& Lck,
const chrono::time_point<Clock, Duration>& Abs_time);
template <class Clock, class Duration, class Predicate>
bool wait_until(
unique_lock<mutex>& Lck,
const chrono::time_point<Clock, Duration>& Abs_time,
Predicate Pred);
cv_status wait_until(
unique_lock<mutex>& Lck,
const xtime* Abs_time);
template <class Predicate>
bool wait_until(
unique_lock<mutex>& Lck,
const xtime* Abs_time,
Predicate Pred);
參數
Lck
<unique_lock mutex> 物件。
Abs_time
chrono::time_point 物件。
Pred
傳回 true
或 false
的任何運算式。
傳回值
如果等候在經過 Abs_time時終止,則傳回cv_status
型別的方法會傳回 cv_status::timeout
。 否則,方法會傳回 cv_status::no_timeout
。
傳回 bool
Pred 值的方法。
備註
系統會封鎖第一個方法,直到 condition_variable
物件收到 notify_one 或 notify_all 的呼叫訊號,或直到 Abs_time
為止。 它也可能會假性喚醒。
而第二種方法會執行下列程式碼。
while(!Pred())
if(wait_until(Lck, Abs_time) == cv_status::timeout)
return Pred();
return true;
第三個和第四個方法會使用 xtime
類型的物件指標來取代 chrono::time_point
物件。 xtime
物件可指定等待訊號的時間量上限。