condition_variable_any クラス
condition_variable_any
型を持つイベントを待機するには、クラス mutex
を使用します。
構文
class condition_variable_any;
メンバー
コンストラクター
名前 | 説明 |
---|---|
condition_variable_any | condition_variable_any オブジェクトを構築します。 |
関数
名前 | 説明 |
---|---|
notify_all | condition_variable_any オブジェクトを待機しているすべてのスレッドのブロックを解除します。 |
notify_one | condition_variable_any オブジェクトを待機しているスレッドの 1 つのブロックを解除します。 |
待機 | スレッドをブロックします。 |
wait_for | スレッドをブロックし、スレッドがブロック解除されるまでの時間間隔を設定します。 |
wait_until | スレッドをブロックし、スレッドがブロック解除される最大の時刻を設定します。 |
condition_variable_any
condition_variable_any
オブジェクトを構築します。
condition_variable_any();
解説
十分なメモリが使用できない場合、コンストラクターは not_enough_memory
エラー コードがある system_error オブジェクトをスローします。 他のリソースをいくつか使用できないためにオブジェクトが構築できない場合、コンストラクターは system_error
エラー コードがある resource_unavailable_try_again
オブジェクトをスローします。
notify_all
condition_variable_any
オブジェクトを待機しているすべてのスレッドのブロックを解除します。
void notify_all() noexcept;
notify_one
condition_variable_any
オブジェクトを待機しているスレッドの 1 つのブロックを解除します。
void notify_one() noexcept;
wait
スレッドをブロックします。
template <class Lock>
void wait(Lock& Lck);
template <class Lock, class Predicate>
void wait(Lock& Lck, Predicate Pred);
パラメーター
Lck
任意の型の mutex
オブジェクト。
Pred
true
または false
を返す任意の式。
解説
最初のメソッドは condition_variable_any
オブジェクトが notify_one または notify_all への呼び出しによって通知されるまでブロックします。 また、擬似的に開始することもできます。
実際には、2 つ目のメソッドは次のコードを実行します。
while (!Pred())
wait(Lck);
wait_for
スレッドをブロックし、スレッドがブロック解除されるまでの時間間隔を設定します。
template <class Lock, class Rep, class Period>
bool wait_for(Lock& Lck, const chrono::duration<Rep, Period>& Rel_time);
template <class Lock, class Rep, class Period, class Predicate>
bool wait_for(Lock& Lck, const chrono::duration<Rep, Period>& Rel_time, Predicate Pred);
パラメーター
Lck
任意の型の mutex
オブジェクト。
Rel_time
スレッドが開始するまでの時間の長さを指定する chrono::duration
オブジェクト。
Pred
true
または false
を返す任意の式。
戻り値
Rel_time が経過したときに待機が終了した場合、最初のメソッドは cv_status::timeout
を返します。 それ以外の場合、メソッドは cv_status::no_timeout
を返します。
2 番目のメソッドは、Pred の値を返します。
解説
最初のメソッドは condition_variable_any
オブジェクトが 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 Lock, class Clock, class Duration>
void wait_until(Lock& Lck, const chrono::time_point<Clock, Duration>& Abs_time);
template <class Lock, class Clock, class Duration, class Predicate>
void wait_until(
Lock& Lck,
const chrono::time_point<Clock, Duration>& Abs_time,
Predicate Pred);
template <class Lock>
void wait_until(Lock Lck, const xtime* Abs_time);
template <class Lock, class Predicate>
void wait_until(
Lock Lck,
const xtime* Abs_time,
Predicate Pred);
パラメーター
Lck
ミューテックス オブジェクト。
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
オブジェクトは、シグナルを待機する時間の最大値を指定します。