<atomic>
関数
atomic_compare_exchange_strong
atomic_compare_exchange_strong_explicit
atomic_compare_exchange_weak
atomic_compare_exchange_weak_explicit
atomic_exchange
atomic_exchange_explicit
atomic_fetch_add
atomic_fetch_add_explicit
atomic_fetch_and
atomic_fetch_and_explicit
atomic_fetch_or
atomic_fetch_or_explicit
atomic_fetch_sub
atomic_fetch_sub_explicit
atomic_fetch_xor
atomic_fetch_xor_explicit
atomic_flag_clear
atomic_flag_clear_explicit
atomic_flag_test_and_set
atomic_flag_test_and_set_explicit
atomic_init
atomic_is_lock_free
atomic_load
atomic_load_explicit
atomic_signal_fence
atomic_store
atomic_store_explicit
atomic_thread_fence
kill_dependency
atomic_compare_exchange_strong
アトミックの比較および交換の操作を実行します。
template <class Ty>
inline bool atomic_compare_exchange_strong(
volatile atomic<Ty>* Atom,
Ty* Exp,
Value) noexcept;
template <class Ty>
inline bool atomic_compare_exchange_strong(
atomic<Ty>* Atom,
Ty* Exp,
Ty Value) noexcept;
パラメーター
Atom
atomic
型の値が格納された Ty
オブジェクトへのポインター。
Exp
Ty
型の値へのポインター。
Value
Ty
型の値。
戻り値
両方の値が等しい場合は true
、それ以外の場合は false
。
解説
このメソッドは暗黙の memory_order.memory_order_seq_cst
引数でアトミックを比較し、交換の操作を実行します。 詳細については、atomic_compare_exchange_strong_explicit
を参照してください。
atomic_compare_exchange_strong_explicit
atomic compare and exchange
操作を実行します。
template <class T>
inline bool atomic_compare_exchange_strong_explicit(
volatile atomic<Ty>* Atom,
Ty* Exp,
Ty Value,
memory_order Order1,
memory_order Order2) noexcept;
template <class Ty>
inline bool atomic_compare_exchange_strong_explicit(
atomic<Ty>* Atom,
Ty* Exp,
Ty Value,
memory_order Order1,
memory_order Order2) noexcept;
パラメーター
Atom
atomic
型の値が格納された Ty
オブジェクトへのポインター。
Exp
Ty
型の値へのポインター。
Value
Ty
型の値。
Order1
最初の memory_order
引数。
Order2
2 番目の memory_order
引数。 Order2
の値は memory_order_release
または memory_order_acq_rel
にすることはできず、Order1
、の値よりも強くすることもできません。
戻り値
両方の値が等しい場合は true
、それ以外の場合は false
。
解説
atomic compare and exchange operation
は、Atom
がポイントするオブジェクトに格納されている値を、Exp
がポイントする値と比較します。 値が等しい場合、Atom
がポイントするオブジェクトに格納されている値は、読み取り/変更/書き込み操作を使用し、Order1
で指定されたメモリ順序制約を適用することで、Value
と置き換えられます。 値が等しくない場合、操作は Exp
でポイントされた値を Atom
でポイントされたオブジェクト内に格納された値と置き換え、Order2
で指定されたメモリ順序制約を適用します。
atomic_compare_exchange_weak
弱いアトミックの比較および交換の操作を実行します。
template <class Ty>
inline bool atomic_compare_exchange_strong(
volatile atomic<Ty>* Atom,
Ty* Exp,
Ty Value) noexcept;
template <class Ty>
inline bool atomic_compare_exchange_strong(
atomic<Ty>* Atom,
Ty* Exp,
Ty Value) noexcept;
パラメーター
Atom
atomic
型の値が格納された Ty
オブジェクトへのポインター。
Exp
Ty
型の値へのポインター。
Value
Ty
型の値。
戻り値
両方の値が等しい場合は true
、それ以外の場合は false
。
解説
このメソッドは、暗黙の memory_order.memory_order_seq_cst
引数を持つ weak atomic compare and exchange operation を実行します。 詳細については、atomic_compare_exchange_weak_explicit
を参照してください。
atomic_compare_exchange_weak_explicit
弱いアトミックの比較および交換の操作を実行します。
template <class Ty>
inline bool atomic_compare_exchange_weak_explicit(
volatile atomic<Ty>* Atom,
Ty* Exp,
Ty Value,
memory_order Order1,
memory_order Order2) noexcept;
template <class Ty>
inline bool atomic_compare_exchange_weak_explicit(
atomic<Ty>* Atom,
Ty* Exp,
Ty Value,
memory_order Order1,
memory_order Order2) noexcept;
パラメーター
Atom
atomic
型の値が格納された Ty
オブジェクトへのポインター。
Exp
Ty
型の値へのポインター。
Value
Ty
型の値。
Order1
最初の memory_order
引数。
Order2
2 番目の memory_order
引数。 Order2
の値は memory_order_release
または memory_order_acq_rel
にすることはできず、Order1
の値よりも強くすることもできません。
戻り値
両方の値が等しい場合は true
、それ以外の場合は false
。
解説
atomic compare and exchange operation
の強いフレーバーと弱いフレーバーはどちらも、期待値と現在の値が等しくない場合、新しい値が格納されないことを保証します。 強いフレーバーは、期待値と現在の値が等しい場合に、新しい値を格納することを保証します。 弱いフレーバーは、現在の値と期待値が等しい場合でも、false
を返し、新しい値を格納しない場合があります。 つまり、関数は false
を返しますが、後で期待値を調べると、期待値が変更されていないことが判明する可能性があるため、同等として比較する必要があります。
atomic_exchange
Value
を使用して Atom
の格納されている値を置き換えます。
template <class T>
inline Ty atomic_exchange(volatile atomic<Ty>* _Atom, Ty Value) noexcept;
template <class Ty>
inline T atomic_exchange(atomic<Ty>* Atom, Ty Value) noexcept;
パラメーター
Atom
atomic
型の値が格納された Ty
オブジェクトへのポインター。
Value
Ty
型の値。
戻り値
交換前の Atom
の格納された値。
解説
atomic_exchange
関数は、memory_order.memory_order_seq_cst
を使用して、読み取り/変更/書き込み操作を実行し、Atom
に格納されている値を Value
と交換します。
atomic_exchange_explicit
Atom
に格納されている値を Value
に置き換えます。
template <class Ty>
inline Ty atomic_exchange_explicit(
volatile atomic<Ty>* Atom,
Ty Value,
memory_order Order) noexcept;
template <class Ty>
inline Ty atomic_exchange_explicit(
atomic<Ty>* Atom,
Ty Value,
memory_order Order) noexcept;
パラメーター
Atom
atomic
型の値が格納された Ty
オブジェクトへのポインター。
Value
Ty
型の値。
Order
memory_order
。
戻り値
交換前の Atom
の格納された値。
解説
atomic_exchange_explicit
関数は、読み取り/変更/書き込み操作を実行して、Order
で指定されたメモリ制約内で、Atom
に格納されている値を Value
と交換します。
atomic_fetch_add
atomic
オブジェクトに格納されている既存の値に値を加算します。
template <class T>
T* atomic_fetch_add(volatile atomic<T*>* Atom, ptrdiff_t Value) noexcept;
template <class T>
T* atomic_fetch_add(atomic<T*>* Atom, ptrdiff_t Value) noexcept;
パラメーター
Atom
atomic
型のポインターが格納された T
オブジェクトへのポインター。
Value
ptrdiff_t
型の値。
戻り値
操作の直前に atomic
オブジェクトによって格納されたポインターの値。
解説
atomic_fetch_add
関数は、memory_order.memory_order_seq_cst
制約を使用して、Atom
に格納されている値に Value
をアトミックに追加するための読み取り/変更/書き込み操作を実行します。
アトミック型が atomic_address
の場合、Value
に ptrdiff_t
型があり、操作は char *
として格納されているポインターを処理します。
この操作は、整数型に対してもオーバーロードします。
integral atomic_fetch_add(volatile atomic-integral* Atom, integral Value) noexcept;
integral atomic_fetch_add(atomic-integral* Atom, integral Value) noexcept;
atomic_fetch_add_explicit
atomic
オブジェクトに格納されている既存の値に値を加算します。
template <class T>
T* atomic_fetch_add_explicit(
volatile atomic<T*>* Atom,
ptrdiff_t Value,
memory_order Order) noexcept;
template <class T>
T* atomic_fetch_add_explicit(
atomic<T*>* Atom,
ptrdiff_t Value,
memory_order Order) noexcept;
パラメーター
Atom
atomic
型のポインターが格納された T
オブジェクトへのポインター。
Value
ptrdiff_t
型の値。
戻り値
操作の直前に atomic
オブジェクトによって格納されたポインターの値。
解説
atomic_fetch_add_explicit
関数は、読み取り/変更/書き込み操作を実行して、Order
で指定された memory_order
制約内で、Atom
に格納されている値に Value
をアトミックに追加します。
アトミック型が atomic_address
の場合、Value
に ptrdiff_t
型があり、操作は char *
として格納されているポインターを処理します。
この操作は、整数型に対してもオーバーロードします。
integral atomic_fetch_add_explicit(
volatile atomic-integral* Atom,
integral Value,
memory_order Order) noexcept;
integral atomic_fetch_add_explicit(
atomic-integral* Atom,
integral Value,
memory_order Order) noexcept;
atomic_fetch_and
値と &
オブジェクトに格納されている既存の値にビットごとの atomic
を実行します。
template <class T>
inline T atomic_fetch_and(volatile atomic<T>* Atom, T Value) noexcept;
template <class T>
inline T atomic_fetch_and(volatile atomic<T>* Atom, T Value) noexcept;
パラメーター
Atom
atomic
型の値が格納された T
オブジェクトへのポインター。
Value
T
型の値。
戻り値
操作が実行される直前の atomic
オブジェクトに含まれる値。
解説
atomic_fetch_and
関数は、memory_order.memory_order_seq_cst
制約を使用して、Atom
の格納された値をビット単位の Value
の &
および Atom
に格納されている現在の値に置き換えるための読み取り/変更/書き込み操作を実行します。
atomic_fetch_and_explicit
値と &
オブジェクトに格納されている既存の値のビットごとの atomic
を実行します。
template <class T>
inline T atomic_fetch_and_explicit(
volatile atomic<T>* Atom,
T Value,
memory_order Order) noexcept;
template <class T>
inline T atomic_fetch_and_explicit(
volatile atomic<T>* Atom,
T Value,
memory_order Order) noexcept;
パラメーター
Atom
atomic
型の値が格納された T
オブジェクトへのポインター。
Value
T
型の値。
Order
memory_order
。
戻り値
操作が実行される直前の atomic
オブジェクトに含まれる値。
解説
atomic_fetch_and_explicit
関数は、読み取り/変更/書き込み操作を実行して、Atom
の格納された値を、Order
で指定されたメモリ制約内で、ビット単位の Value
の &
値と Atom
に格納された現在の値に置き換えます。
atomic_fetch_or
値と or
オブジェクトに格納されている既存の値にビットごとの atomic
を実行します。
template <class T>
inline T atomic_fetch_or (volatile atomic<T>* Atom, T Value) noexcept;
template <class T>
inline T atomic_fetch_or (volatile atomic<T>* Atom, T Value) noexcept;
パラメーター
Atom
atomic
型の値が格納された T
オブジェクトへのポインター。
Value
T
型の値。
戻り値
操作が実行される直前の atomic
オブジェクトに含まれる値。
解説
atomic_fetch_or
関数は、memory_order.memory_order_seq_cst
を使用して、Atom
の格納された値をビット単位の Value
の or
および Atom
に格納されている現在の値に置き換えるための読み取り/変更/書き込み操作を実行します。
atomic_fetch_or_explicit
値と or
オブジェクトに格納されている既存の値にビットごとの atomic
を実行します。
template <class T>
inline T atomic_fetch_or_explicit(
volatile atomic<T>* Atom,
T Value,
memory_order Order) noexcept;
template <class T>
inline T atomic_fetch_or_explicit(
volatile atomic<T>* Atom,
T Value,
memory_order Order) noexcept;
パラメーター
Atom
atomic
型の値が格納された T
オブジェクトへのポインター。
Value
T
型の値。
Order
memory_order
。
戻り値
操作が実行される直前の atomic
オブジェクトに含まれる値。
解説
atomic_fetch_or_explicit
関数は、Order
で指定されている memory_order
制約内で、Atom
に格納されている値をビットごとの Value
の or
と Atom
に格納されている現在の値に置換するための読み取り/変更/書き込み操作を実行します。
atomic_fetch_sub
atomic
オブジェクトに格納されている既存の値から値を減算します。
template <class T>
T* atomic_fetch_sub(
volatile atomic<T*>* Atom,
ptrdiff_t Value) noexcept;
template <class T>
T* atomic_fetch_sub(
atomic<T*>* Atom,
ptrdiff_t Value) noexcept;
パラメーター
Atom
atomic
型のポインターが格納された T
オブジェクトへのポインター。
Value
ptrdiff_t
型の値。
戻り値
操作の直前に atomic
オブジェクトによって格納されたポインターの値。
解説
atomic_fetch_sub
関数は、memory_order.memory_order_seq_cst
制約を使用して、Atom
に格納されている値から Value
をアトミックに減算するための読み取り/変更/書き込み操作を実行します。
アトミック型が atomic_address
の場合、Value
に ptrdiff_t
型があり、操作は char *
として格納されているポインターを処理します。
この操作は、整数型に対してもオーバーロードします。
integral atomic_fetch_sub(volatile atomic-integral* Atom, integral Value) noexcept;
integral atomic_fetch_sub(atomic-integral* Atom, integral Value) noexcept;
atomic_fetch_sub_explicit
atomic
オブジェクトに格納されている既存の値から値を減算します。
template <class T>
T* atomic_fetch_sub_explicit(
volatile atomic<T*>* Atom,
ptrdiff_t Value,
memory_order Order) noexcept;
template <class T>
T* atomic_fetch_sub_explicit(
atomic<T*>* Atom,
ptrdiff_t Value, memory_order Order) noexcept;
パラメーター
Atom
atomic
型のポインターが格納された T
オブジェクトへのポインター。
Value
ptrdiff_t
型の値。
戻り値
操作の直前に atomic
オブジェクトによって格納されたポインターの値。
解説
atomic_fetch_sub_explicit
関数は、Order
で指定された memory_order
の制約内で Atom
に格納されている値から Value
をアトミックに減算するための読み取り/変更/書き込み操作を実行します。
アトミック型が atomic_address
の場合、Value
に ptrdiff_t
型があり、操作は char *
として格納されているポインターを処理します。
この操作は、整数型に対してもオーバーロードします。
integral atomic_fetch_sub_explicit(
volatile atomic-integral* Atom,
integral Value,
memory_order Order) noexcept;
integral atomic_fetch_sub_explicit(
atomic-integral* Atom,
integral Value,
memory_order Order) noexcept;
atomic_fetch_xor
値と exclusive or
オブジェクトに格納されている既存の値にビットごとの atomic
を実行します。
template <class T>
inline T atomic_fetch_xor(volatile atomic<T>* Atom, T Value) noexcept;
template <class T>
inline T atomic_fetch_xor(volatile atomic<T>* Atom, T Value) noexcept;
パラメーター
Atom
atomic
型の値が格納された T
オブジェクトへのポインター。
Value
T
型の値。
戻り値
操作が実行される直前の atomic
オブジェクトに含まれる値。
解説
atomic_fetch_xor
関数は、memory_order.memory_order_seq_cst
を使用して、Atom
の格納された値をビット単位の Value
の exclusive or
および Atom
に格納されている現在の値に置き換えるための読み取り/変更/書き込み操作を実行します。
atomic_fetch_xor_explicit
値と atomic
オブジェクトに格納されている既存の値にビットごとの exclusive or
を実行します。
template <class T>
inline T atomic_fetch_xor_explicit(
volatile atomic<T>* Atom,
T Value,
memory_order Order) noexcept;
template <class T>
inline T atomic_fetch_xor_explicit(
volatile atomic<T>* Atom,
T Value,
memory_order Order) noexcept;
パラメーター
Atom
atomic
型の値が格納された T
オブジェクトへのポインター。
Value
T
型の値。
Order
memory_order
。
戻り値
操作が実行される直前の atomic
オブジェクトに含まれる値。
解説
atomic_fetch_xor_explicit
関数は、Order
で指定されている memory_order
制約内で、Atom
に格納されている値をビットごとの Value
の exclusive or
と Atom
に格納されている現在の値に置換するための読み取り/変更/書き込み操作を実行します。
atomic_flag_clear
memory_order.memory_order_seq_cst
の範囲内で、atomic_flag
オブジェクトの bool
フラグを false
に設定します。
inline void atomic_flag_clear(volatile atomic_flag* Flag) noexcept;
inline void atomic_flag_clear(atomic_flag* Flag) noexcept;
パラメーター
Flag
atomic_flag
オブジェクトへのポインター。
atomic_flag_clear_explicit
指定された memory_order
の制約内で、atomic_flag
オブジェクトの bool
フラグを false
に設定します。
inline void atomic_flag_clear_explicit(volatile atomic_flag* Flag, memory_order Order) noexcept;
inline void atomic_flag_clear_explicit(atomic_flag* Flag, memory_order Order) noexcept;
パラメーター
Flag
atomic_flag
オブジェクトへのポインター。
Order
memory_order
です。
atomic_flag_test_and_set
memory_order.memory_order_seq_cst
の制約内で、atomic_flag
オブジェクトの bool
フラグを true
に設定します。
inline bool atomic_flag_test_and_set(volatile atomic_flag* Flag,) noexcept;
inline bool atomic_flag_test_and_set(atomic_flag* Flag,) noexcept;
パラメーター
Flag
atomic_flag
オブジェクトへのポインター。
戻り値
Flag
の初期値になります。
atomic_flag_test_and_set_explicit
指定された memory_order
の制約内で、atomic_flag
オブジェクトの bool
フラグを true
に設定します。
inline bool atomic_flag_test_and_set_explicit(volatile atomic_flag* Flag, memory_order Order) noexcept;
inline bool atomic_flag_test_and_set_explicit(atomic_flag* Flag, memory_order Order) noexcept;
パラメーター
Flag
atomic_flag
オブジェクトへのポインター。
Order
memory_order
。
戻り値
Flag
の初期値になります。
atomic_init
atomic
オブジェクトに格納されている値を設定します。
template <class Ty>
inline void atomic_init(volatile atomic<Ty>* Atom, Ty Value) noexcept;
template <class Ty>
inline void atomic_init(atomic<Ty>* Atom, Ty Value) noexcept;
パラメーター
Atom
atomic
型の値が格納された Ty
オブジェクトへのポインター。
Value
Ty
型の値。
解説
atomic_init
はアトミック操作ではありません。 これはスレッド セーフではありません。
atomic_is_lock_free
atomic
オブジェクトに対するアトミック操作がロック制御不要であるかどうかを指定します。
template <class T>
inline bool atomic_is_lock_free(const volatile atomic<T>* Atom) noexcept;
template <class T>
inline bool atomic_is_lock_free(const atomic<T>* Atom) noexcept;
パラメーター
Atom
atomic
型の値が格納された T
オブジェクトへのポインター。
戻り値
Atom
に対するアトミック操作がロック制御不要の場合は true
、それ以外の場合は false
。
解説
その型に対してロックを使用するアトミック操作がない場合、atomic 型はロック制御不要になります。 この関数が true
を返す場合、その型はシグナル ハンドラーで使用しても安全です。
atomic_load
atomic
オブジェクトに格納されている値を取得します。
template <class Ty>
inline Ty atomic_load(const volatile atomic<Ty>* Atom) noexcept;
template <class Ty>
inline Ty atomic_load(const atomic<Ty>* Atom) noexcept;
パラメーター
Atom
atomic
型の値が格納された Ty
オブジェクトへのポインター。
戻り値
Atom
に格納された取得された値。
解説
atomic_load
は暗黙的に memory_order.memory_order_seq_cst
を使用します。
atomic_load_explicit
指定された memory_order
内の atomic
オブジェクトに格納されている値を取得します。
template <class Ty>
inline Ty atomic_load_explicit(const volatile atomic<Ty>* Atom, memory_order Order) noexcept;
template <class Ty>
inline Ty atomic_load_explicit(const atomic<Ty>* Atom, memory_order Order) noexcept;
パラメーター
Atom
atomic
型の値が格納された Ty
オブジェクトへのポインター。
Order
memory_order
です。 memory_order_release
または memory_order_acq_rel
を使用しないでください。
戻り値
Atom
に格納された取得された値。
atomic_signal_fence
同じスレッドで実行されるシグナル ハンドラーを持つ呼び出し元のスレッドで、他のフェンス間で (読み込み/ストア操作間の命令を実装するメモリの同期プリミティブである) "フェンス" として機能します。
inline void atomic_signal_fence(memory_order Order) noexcept;
パラメーター
Order
フェンスの種類を決定するメモリ オーダリングの制約。
解説
Order
引数により、フェンスの種類が決まります。
値 | 説明 |
---|---|
memory_order_relaxed |
フェンスは無効です。 |
memory_order_consume |
フェンスは取得フェンスです。 |
memory_order_acquire |
フェンスは取得フェンスです。 |
memory_order_release |
フェンスは解放フェンスです。 |
memory_order_acq_rel |
フェンスは取得フェンスと解放フェンスの両方です。 |
memory_order_seq_cst |
フェンスは取得フェンスと解放フェンスの両方であり、順番に一貫性があります。 |
atomic_store
atomic
オブジェクトに値をアトミックに格納します。
template <class Ty>
inline Ty atomic_store_explicit(const volatile atomic<Ty>* Atom, Ty Value) noexcept;
template <class Ty>
inline Ty atomic_store_explicit(const atomic<Ty>* Atom, T Value) noexcept;
パラメーター
Atom
atomic
型の値が格納された Ty
オブジェクトへのポインター。
Value
Ty
型の値。
解説
atomic_store
は memory_order.memory_order_seq_cst
の制約内で Atom
が指すオブジェクト内に Value
を格納します。
atomic_store_explicit
atomic
オブジェクトに値をアトミックに格納します。
template <class Ty>
inline Ty atomic_store_explicit(
const volatile atomic<Ty>* Atom,
Ty Value,
memory_order Order) noexcept;
template <class Ty>
inline Ty atomic_store_explicit(
const atomic<Ty>* Atom,
T Value,
memory_order Order) noexcept;
パラメーター
Atom
atomic
型の値が格納された Ty
オブジェクトへのポインター。
Value
Ty
型の値。
Order
memory_order
です。 memory_order_consume
、memory_order_acquire
、または memory_order_acq_rel
を使用しないでください。
解説
atomic_store
は Value
で指定された Atom
内で memory_order
が指すオブジェクト内に Order
を格納します。
atomic_thread_fence
関連するアトミック操作なしで "フェンス" (読み込み/ストア操作間の命令を実装するメモリの同期プリミティブ) として機能します。
inline void atomic_thread_fence(memory_order Order) noexcept;
パラメーター
Order
フェンスの種類を決定するメモリ オーダリングの制約。
解説
Order
引数により、フェンスの種類が決まります。
値 | 説明 |
---|---|
memory_order_relaxed |
フェンスは無効です。 |
memory_order_consume |
フェンスは取得フェンスです。 |
memory_order_acquire |
フェンスは取得フェンスです。 |
memory_order_release |
フェンスは解放フェンスです。 |
memory_order_acq_rel |
フェンスは取得フェンスと解放フェンスの両方です。 |
memory_order_seq_cst |
フェンスは取得フェンスと解放フェンスの両方であり、順番に一貫性があります。 |
kill_dependency
依存関係を削除します。
template <class Ty>
Ty kill_dependency(Ty Arg) noexcept;
パラメーター
Arg
Ty
型の値。
戻り値
戻り値は Arg
です。 Arg
の評価は関数呼び出しに依存関係を伝達しません。 可能な依存関係チェーンを分割することで、関数はより効率的なコードを生成することをコンパイラに許可できます。