Namespaces
Variants

std:: atomic_wait, std:: atomic_wait_explicit

From cppreference.net
Concurrency support library
Threads
(C++11)
(C++20)
this_thread namespace
(C++11)
(C++11)
Cooperative cancellation
Mutual exclusion
Generic lock management
Condition variables
(C++11)
Semaphores
Latches and Barriers
(C++20)
(C++20)
Futures
(C++11)
(C++11)
(C++11)
Safe reclamation
Hazard pointers
Atomic types
(C++11)
(C++20)
Initialization of atomic types
(C++11) (deprecated in C++20)
(C++11) (deprecated in C++20)
Memory ordering
(C++11) (deprecated in C++26)
Free functions for atomic operations
atomic_wait atomic_wait_explicit
(C++20) (C++20)
Free functions for atomic flags
ヘッダーで定義 <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 の値表現を比較する。
    • ビット単位で等しい場合、 * object std::atomic::notify_one() または std::atomic::notify_all() によって通知されるか、スレッドが偽起床するまでブロックする。
    • それ以外の場合、直ちに戻る。

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

1,2) 次と同等: object - > wait ( old ) .
3,4) 次と同等: object - > wait ( old, order ) .
orderが order であり、かつ std :: memory_order :: release または std :: memory_order :: acq_rel の場合、動作は未定義です。

目次

パラメータ

object - チェックおよび待機対象のアトミックオブジェクトへのポインタ
old - アトミックオブジェクトが保持していないことを確認する値
order - メモリ同期順序

戻り値

(なし)

注記

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

ABA問題 のため、 old から別の値へ一時的に変化し、再び old に戻る変更が見逃され、ブロック解除が行われない可能性があります。

比較はビット単位で行われます( std::memcmp と同様)。比較演算子は使用されません。オブジェクトの値表現に決して関与しないパディングビットは無視されます。

関連項目

(C++20)
通知されるまでスレッドをブロックし、アトミック値が変更されるのを待機する
( std::atomic<T> の公開メンバ関数)
(C++20)
アトミックオブジェクトを待機している少なくとも1つのスレッドに通知する
( std::atomic<T> の公開メンバ関数)
(C++20)
アトミックオブジェクトを待機している全てのスレッドに通知する
( std::atomic<T> の公開メンバ関数)
atomic_waitでブロックされているスレッドに通知する
(関数テンプレート)
atomic_waitでブロックされている全てのスレッドに通知する
(関数テンプレート)