次の方法で共有


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 を返します。

boolPred 戻り値を返すメソッド。

解説

最初のメソッドは 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 オブジェクトは、シグナルを待機する時間の最大値を指定します。