次の方法で共有


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

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

関連項目

ヘッダー ファイル リファレンス
<condition_variable>