condition_variable クラス
condition_variable
型の mutex
がある場合に、イベントを待機するために unique_lock<mutex>
クラスを使用します。 この型のオブジェクトは 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 オブジェクトを待機しているスレッドの 1 つのブロックを解除します。 |
待機 | スレッドをブロックします。 |
wait_for | スレッドをブロックし、スレッドがブロック解除されるまでの時間間隔を設定します。 |
wait_until | スレッドをブロックし、スレッドがブロック解除される最大の時刻を設定します。 |
condition_variable
condition_variable
オブジェクトを構築します。
condition_variable();
解説
十分なメモリが使用できない場合、コンストラクターは not_enough_memory
エラー コードがある system_error オブジェクトをスローします。 他のリソースをいくつか使用できないためにオブジェクトが構築できない場合、コンストラクターは system_error
エラー コードがある resource_unavailable_try_again
オブジェクトをスローします。
native_handle
condition_variable ハンドルを表す実装固有の型を返します。
native_handle_type native_handle();
戻り値
native_handle_type
は、コンカレンシー ランタイムの内部データ構造へのポインターとして定義されます。
notify_all
condition_variable
オブジェクトを待機しているすべてのスレッドのブロックを解除します。
void notify_all() noexcept;
notify_one
condition_variable
オブジェクトを待機しているスレッドの 1 つのブロックを解除します。
void notify_one() noexcept;
wait
スレッドをブロックします。
void wait(unique_lock<mutex>& Lck);
template <class Predicate>
void wait(unique_lock<mutex>& Lck, Predicate Pred);
パラメーター
Lck
A unique_lock<mutex> オブジェクト。
Pred
true
または false
を返す任意の式。
解説
最初のメソッドは condition_variable
オブジェクトが notify_one または notify_all への呼び出しによって通知されるまでブロックします。 また、擬似的に開始することもできます。
実際には、2 つ目のメソッドは次のコードを実行します。
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
A unique_lock<mutex> オブジェクト。
Rel_time
スレッドが開始するまでの時間の長さを指定する chrono::duration
オブジェクト。
Pred
true
または false
を返す任意の式。
戻り値
Rel_time が経過したときに待機が終了した場合、最初のメソッドは cv_status::timeout
を返します。 それ以外の場合、メソッドは cv_status::no_timeout
を返します。
2 番目のメソッドは、Pred の値を返します。
解説
最初のメソッドは condition_variable
オブジェクトが notify_one または notify_all への呼び出しによって通知されるか、時間間隔 Rel_time が経過するまでブロックします。 また、擬似的に開始することもできます。
実際には、2 つ目のメソッドは次のコードを実行します。
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
A 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
までブロックします。 また、擬似的に開始することもできます。
実際には、2 つ目のメソッドは次のコードを実行します。
while(!Pred())
if(wait_until(Lck, Abs_time) == cv_status::timeout)
return Pred();
return true;
3 つ目のメソッドと 4 つ目のメソッドは、xtime
型のオブジェクトへのポインターを使用して、chrono::time_point
オブジェクトを置き換えます。 xtime
オブジェクトは、シグナルを待機する時間の最大値を指定します。