<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 の場合、Valueptrdiff_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 の場合、Valueptrdiff_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 の格納された値をビット単位の Valueor および 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 に格納されている値をビットごとの ValueorAtom に格納されている現在の値に置換するための読み取り/変更/書き込み操作を実行します。

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 の場合、Valueptrdiff_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 の場合、Valueptrdiff_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 の格納された値をビット単位の Valueexclusive 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 に格納されている値をビットごとの Valueexclusive orAtom に格納されている現在の値に置換するための読み取り/変更/書き込み操作を実行します。

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 引数により、フェンスの種類が決まります。

Value 説明
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_storememory_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_consumememory_order_acquire、または memory_order_acq_rel を使用しないでください。

解説

atomic_storeValue で指定された Atom 内で memory_order が指すオブジェクト内に Order を格納します。

atomic_thread_fence

関連するアトミック操作なしで "フェンス" (読み込み/ストア操作間の命令を実装するメモリの同期プリミティブ) として機能します。

inline void atomic_thread_fence(memory_order Order) noexcept;

パラメーター

Order
フェンスの種類を決定するメモリ オーダリングの制約。

解説

Order 引数により、フェンスの種類が決まります。

Value 説明
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 の評価は関数呼び出しに依存関係を伝達しません。 可能な依存関係チェーンを分割することで、関数はより効率的なコードを生成することをコンパイラに許可できます。

関連項目

<atomic>