std::atomic_wait, std::atomic_wait_explicit
From cppreference.com
| ヘッダー <atomic> で定義 |
||
| template< class T > void atomic_wait( const std::atomic<T>* object, |
(1) | (C++20以降) |
| template< class T > void atomic_wait( const volatile std::atomic<T>* object, |
(2) | (C++20以降) |
| template< class T > void atomic_wait_explicit( const std::atomic<T>* object, |
(3) | (C++20以降) |
| template< class T > void atomic_wait_explicit( const volatile std::atomic<T>* object, |
(4) | (C++20以降) |
アトミックな待機操作を実行します。繰り返し以下のステップを実行するのと同等に動作します。
- object->load() (オーバーロード (1,2) の場合) または object->load(order) (オーバーロード (3,4) の場合) の 値表現 を old の値表現と比較します。
- それらがビット列として等しい場合、*object が std::atomic::notify_one() または std::atomic::notify_all() によって通知されるか、スレッドが偽って(spuriously)解除されるまでブロックします。
- それ以外の場合は、戻ります。
これらの関数は、基盤となる実装が偽って(spuriously)解除された場合でも、値が変更された場合にのみ戻ることが保証されています。
1,2) object->wait(old) と同等です。
3,4) object->wait(old, order) と同等です。
order が std::memory_order::release または std::memory_order::acq_rel のいずれかである場合、動作は未定義です。
目次 |
[編集] パラメータ
| オブジェクト (object) | - | チェックおよび待機するアトミックオブジェクトへのポインタ |
| old | - | アトミックオブジェクトがもはや含まない値 |
| order | - | メモリ同期順序 |
[編集] 戻り値
(なし)
[編集] 注記
この形式の変更検出は、単純なポーリングや純粋なスピンドックよりも効率的な場合が多いです。
ABA問題のため、old から別の値への一時的な変更、そして再び old に戻る変更は、見落とされる可能性があり、解除されない場合があります。
比較はビット列(std::memcmp に類似)であり、比較演算子は使用されません。オブジェクトの値表現に決して関与しないパディングビットは無視されます。
[編集] 例
| このセクションは未完成です 理由: 例がありません |
[編集] 関連項目
| (C++20) |
通知されるまで、かつアトミックな値が変更されるまでスレッドをブロックする ( std::atomic<T> の public メンバ関数) |
| (C++20) |
アトミックオブジェクトを待機しているスレッドを少なくとも1つ通知する ( std::atomic<T> の public メンバ関数) |
| (C++20) |
アトミックオブジェクトを待機してブロックされている全てのスレッドに通知する ( std::atomic<T> の public メンバ関数) |
| (C++20) |
atomic_waitでブロックされているスレッドに通知する (関数テンプレート) |
| (C++20) |
atomic_waitでブロックされている全てのスレッドに通知する (関数テンプレート) |