名前空間
変種
操作

std::atomic_wait, std::atomic_wait_explicit

From cppreference.com
< cpp‎ | atomic
 
 
並行性サポートライブラリ
スレッド
(C++11)
(C++20)
this_thread 名前空間
(C++11)
(C++11)
(C++11)
協調的なキャンセル
排他制御
(C++11)
汎用ロック管理
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
条件変数
(C++11)
セマフォ
ラッチとバリア
(C++20)
(C++20)
future
(C++11)
(C++11)
(C++11)
(C++11)
安全なメモリ解放 (Safe Reclamation)
(C++26)
ハザードポインタ
アトミック型
(C++11)
(C++20)
アトミック型の初期化
(C++11)(C++20で非推奨)
(C++11)(C++20で非推奨)
メモリオーダー
(C++11)(C++26で非推奨)
アトミック操作のためのフリー関数
atomic_waitatomic_wait_explicit
(C++20)(C++20)
アトミックフラグのためのフリー関数
 
ヘッダー <atomic> で定義
template< class T >

void atomic_wait( const std::atomic<T>* object,

                  typename std::atomic<T>::value_type old );
(1) (C++20以降)
template< class T >

void atomic_wait( const volatile std::atomic<T>* object,

                  typename std::atomic<T>::value_type old );
(2) (C++20以降)
template< class T >

void atomic_wait_explicit( const std::atomic<T>* object,
                           typename std::atomic<T>::value_type old,

                           std::memory_order order );
(3) (C++20以降)
template< class T >

void atomic_wait_explicit( const volatile std::atomic<T>* object,
                           typename std::atomic<T>::value_type old,

                           std::memory_order order );
(4) (C++20以降)

アトミックな待機操作を実行します。繰り返し以下のステップを実行するのと同等に動作します。

  • object->load() (オーバーロード (1,2) の場合) または object->load(order) (オーバーロード (3,4) の場合) の 値表現old の値表現と比較します。
    • それらがビット列として等しい場合、*objectstd::atomic::notify_one() または std::atomic::notify_all() によって通知されるか、スレッドが偽って(spuriously)解除されるまでブロックします。
    • それ以外の場合は、戻ります。

これらの関数は、基盤となる実装が偽って(spuriously)解除された場合でも、値が変更された場合にのみ戻ることが保証されています。

1,2) object->wait(old) と同等です。
3,4) object->wait(old, order) と同等です。
orderstd::memory_order::release または std::memory_order::acq_rel のいずれかである場合、動作は未定義です。

目次

[編集] パラメータ

オブジェクト (object) - チェックおよび待機するアトミックオブジェクトへのポインタ
old - アトミックオブジェクトがもはや含まない値
order - メモリ同期順序

[編集] 戻り値

(なし)

[編集] 注記

この形式の変更検出は、単純なポーリングや純粋なスピンドックよりも効率的な場合が多いです。

ABA問題のため、old から別の値への一時的な変更、そして再び old に戻る変更は、見落とされる可能性があり、解除されない場合があります。

比較はビット列(std::memcmp に類似)であり、比較演算子は使用されません。オブジェクトの値表現に決して関与しないパディングビットは無視されます。

[編集]

[編集] 関連項目

(C++20)
通知されるまで、かつアトミックな値が変更されるまでスレッドをブロックする
(std::atomic<T> の public メンバ関数) [編集]
アトミックオブジェクトを待機しているスレッドを少なくとも1つ通知する
(std::atomic<T> の public メンバ関数) [編集]
アトミックオブジェクトを待機してブロックされている全てのスレッドに通知する
(std::atomic<T> の public メンバ関数) [編集]
atomic_waitでブロックされているスレッドに通知する
(関数テンプレート) [編集]
atomic_waitでブロックされている全てのスレッドに通知する
(関数テンプレート) [編集]
English 日本語 中文(简体) 中文(繁體)