atomic
構造体
格納された Ty
型の値に対して atomic
操作を実行するオブジェクトについて説明します。
構文
template <class Ty>
struct atomic;
メンバー
メンバー | 説明 |
---|---|
コンストラクター | |
atomic |
アトミック オブジェクトを構築します。 |
オペレーター | |
atomic::operator Ty |
格納されている値を読み取って返します。 (atomic::load ) |
atomic::operator= |
格納されている値を置き換えるために指定された値を使用します。 (atomic::store ) |
atomic::operator++ |
格納されている値をインクリメントします。 整数およびポインターの特殊化でのみ使用されます。 |
atomic::operator+= |
指定された値を、格納されている 値に加算します。 整数およびポインターの特殊化でのみ使用されます。 |
atomic::operator-- |
格納されている値をデクリメントします。 整数およびポインターの特殊化でのみ使用されます。 |
atomic::operator-= |
指定された値を、格納されている 値から減算します。 整数およびポインターの特殊化でのみ使用されます。 |
atomic::operator&= |
指定されている値と格納されている値に対して、ビットごとの "AND" (& ) を実行します。 整数の特殊化でのみ使用されます。 |
atomic::operator|= |
指定されている値と格納されている値に対して、ビットごとの "OR" (| ) を実行します。 整数の特殊化でのみ使用されます。 |
atomic::operator^= |
指定されている値と格納されている値に対して、ビットごとの "排他的 OR" (^ ) を実行します。 整数の特殊化でのみ使用されます。 |
関数 | |
compare_exchange_strong |
atomic_compare_and_exchange に対して this 操作を実行し、その結果を返します。 |
compare_exchange_weak |
weak_atomic_compare_and_exchange に対して this 操作を実行し、その結果を返します。 |
fetch_add |
指定された値を、格納されている 値に加算します。 |
fetch_and |
指定されている値と格納されている値に対して、ビットごとの "AND" (& ) を実行します。 |
fetch_or |
指定されている値と格納されている値に対して、ビットごとの "OR" (| ) を実行します。 |
fetch_sub |
指定された値を、格納されている 値から減算します。 |
fetch_xor |
指定されている値と格納されている値に対して、ビットごとの "排他的 OR" (^ ) を実行します。 |
is_lock_free |
this に対する atomic 操作が "ロック制御不要" であるかどうかを指定します。 その型に対する atomic 操作においてロックが使用されない場合、atomic 型は "ロック制御不要" になります。 |
load |
格納されている値を読み取って返します。 |
store |
格納されている値を置き換えるために指定された値を使用します。 |
解説
Ty
型は、普通にコピー可能である必要があります。 つまり、 memcpy
を使用してバイトをコピーするには、元のオブジェクトと等しい有効な Ty
オブジェクトを生成する必要があります。 compare_exchange_weak
および compare_exchange_strong
のメンバー関数では、memcmp
を使用して 2 つの Ty
値が等しいかどうかが判断されます。 これらの関数では、Ty
定義の operator==
は使用されません。 atomic
のメンバー関数は、memcpy
を使用して Ty
型の値をコピーします。
部分的特殊化 atomic<Ty*>
は、すべてのポインター型において存在します。 特殊化により、マネージド ポインター値のオフセットの加算またはマネージド ポインター値からのオフセットの減算が可能になります。 算術演算は ptrdiff_t
型の引数を受け取り、通常のアドレス算術演算との一貫性を保つように Ty
のサイズに従ってその引数を調整します。
特殊化は、bool
を除くすべての整数型において存在します。 それぞれの特殊化には、分割不可能な算術演算および論理演算のための豊富な一連のメソッドが用意されています。
atomic<char>
atomic<signed char>
atomic<unsigned char>
atomic<char16_t>
atomic<char32_t>
atomic<wchar_t>
atomic<short>
atomic<unsigned short>
atomic<int>
atomic<unsigned int>
atomic<long>
atomic<unsigned long>
atomic<long long>
atomic<unsigned long long>
整数の特殊化は、対応する atomic_integral
型から派生します。 たとえば、atomic<unsigned int>
は atomic_uint
から派生します。
要件
ヘッダー: <atomic>
名前空間: std
atomic::atomic
アトミック オブジェクトを構築します。
atomic();
atomic( const atomic& );
atomic( Ty Value ) noexcept;
パラメーター
Value
初期化値。
解説
アトミック オブジェクトはコピーまたは移動できません。
atomic<Ty>
のインスタンス化であるオブジェクトは、集約の初期化ではなく、Ty
型の引数を受け取るコンストラクターによってのみ初期化できます。 ただし、atomic_integral
オブジェクトは集約の初期化によってのみ初期化できます。
atomic<int> ai0 = ATOMIC_VAR_INIT(0);
atomic<int> ai1(0);
atomic::operator Ty
テンプレートに指定された型、atomic<Ty>
の演算子。 *this
に格納されている値を取得します。
atomic<Ty>::operator Ty() const volatile noexcept;
atomic<Ty>::operator Ty() const noexcept;
解説
この演算子は、 memory_order_seq_cst
memory_order
を適用します。
atomic::operator=
指定された値を格納します。
Ty operator=(
Ty Value
) volatile noexcept;
Ty operator=(
Ty Value
) noexcept;
パラメーター
Value
Ty
オブジェクト。
戻り値
Value
を返します。
atomic::operator++
格納されている値をインクリメントします。 整数およびポインターの特殊化でのみ使用されます。
Ty atomic<Ty>::operator++(int) volatile noexcept;
Ty atomic<Ty>::operator++(int) noexcept;
Ty atomic<Ty>::operator++() volatile noexcept;
Ty atomic<Ty>::operator++() noexcept;
戻り値
最初の 2 つの演算子は、インクリメントされた値を返し、最後の 2 つの演算子は、インクリメントの前の値を返します。 演算子は、 memory_order_seq_cst
memory_order
を使用します。
atomic::operator+=
指定された値を、格納されている 値に加算します。 整数およびポインターの特殊化でのみ使用されます。
Ty atomic<Ty>::operator+=(
Ty Value
) volatile noexcept;
Ty atomic<Ty>::operator+=(
Ty Value
) noexcept;
パラメーター
Value
整数値またはポインター値。
戻り値
加算の結果を含む Ty
オブジェクト。
解説
この演算子は、 memory_order_seq_cst
memory_order
を使用します。
atomic::operator--
格納されている値をデクリメントします。 整数およびポインターの特殊化でのみ使用されます。
Ty atomic<Ty>::operator--(int) volatile noexcept;
Ty atomic<Ty>::operator--(int) noexcept;
Ty atomic<Ty>::operator--() volatile noexcept;
Ty atomic<Ty>::operator--() noexcept;
戻り値
最初の 2 つの演算子は、デクリメントされた値を返し、最後の 2 つの演算子は、デクリメントの前の値を返します。 演算子は、 memory_order_seq_cst
memory_order
を使用します。
atomic::operator-=
指定された値を、格納されている 値から減算します。 整数およびポインターの特殊化でのみ使用されます。
Ty atomic<Ty>::operator-=(
Ty Value
) volatile noexcept;
Ty atomic<Ty>::operator-=(
Ty Value
) noexcept;
パラメーター
Value
整数値またはポインター値。
戻り値
減算の結果を格納する Ty
オブジェクト。
解説
この演算子は、 memory_order_seq_cst
memory_order
を使用します。
atomic::operator&=
指定されている値と格納されている *this
の値に対して、ビットごとの "AND" (&
) を実行します。 整数の特殊化でのみ使用されます。
atomic<Ty>::operator&= (
Ty Value
) volatile noexcept;
atomic<Ty>::operator&= (
Ty Value
) noexcept;
パラメーター
Value
Ty
型の値。
戻り値
ビットごとの "AND" (&
) の結果。
解説
この演算子は、読み取り/変更/書き込み操作を実行して、*this
の格納された値を、Value
のビットごとの "and" (&
) と、memory_order_seq_cst
memory_order
の制約内で*this
に格納されている現在の値に置き換えます。
atomic::operator|=
指定されている値と格納されている *this
の値に対して、ビットごとの "OR" (|
) を実行します。 整数の特殊化でのみ使用されます。
atomic<Ty>::operator|= (
Ty Value
) volatile noexcept;
atomic<Ty>::operator|= (
Ty Value
) noexcept;
パラメーター
Value
Ty
型の値。
戻り値
ビットごとの "OR" (|
) の結果。
解説
この演算子は、読み取り/変更/書き込み操作を実行して、*this
の格納された値を、memory_order_seq_cst
memory_order
制約の制約内で、Value
のビットごとの "または" (|
) と*this
に格納されている現在の値に置き換えます。
atomic::operator^=
指定されている値と格納されている *this
の値に対して、ビットごとの "排他的 OR" (^
) を実行します。 整数の特殊化でのみ使用されます。
atomic<Ty>::operator^= (
Ty Value
) volatile noexcept;
atomic<Ty>::operator^= (
Ty Value
) noexcept;
パラメーター
Value
Ty
型の値。
戻り値
ビットごとの "排他的 OR" (^
) の結果。
解説
この演算子は、読み取り/変更/書き込み操作を実行して、*this
の格納された値を、Value
のビットごとの "排他" (^
) と、memory_order_seq_cst
memory_order
制約の制約内で*this
に格納されている現在の値に置き換えます。
atomic::compare_exchange_strong
*this
に対してアトミックの比較および交換の操作を実行します。
bool compare_exchange_strong(
Ty& Exp,
Ty Value,
memory_order Order1,
memory_order Order2
) volatile noexcept;
bool compare_exchange_strong(
Ty& Exp,
Ty Value,
memory_order Order1,
memory_order Order2
) noexcept;
bool compare_exchange_strong(
Ty& Exp,
Ty Value,
memory_order Order1 = memory_order_seq_cst
) volatile noexcept;
bool compare_exchange_strong(
Ty& Exp,
Ty Value,
memory_order Order1 = memory_order_seq_cst
) noexcept;
パラメーター
Exp
Ty
型の値。
Value
Ty
型の値。
Order1
最初の memory_order
引数。
Order2
2 番目の memory_order
引数。
戻り値
値の比較の結果を示す bool
。
解説
このアトミックの比較および交換の操作では、*this
に格納されている値と Exp
が比較されます。 値が等しい場合、操作では、読み取り/変更/書き込み操作を使用して、Order1
によって指定されたメモリ順序制約を適用することで、*this
に格納された値が Value
に置き換えられます。 値が等しくない場合、操作では *this
に格納されている値を使用して Exp
が置き換えられ、Order2
によって指定されたメモリ順序制約が適用されます。
2 番目の memory_order
がないオーバーロードでは、Order1
の値に基づく暗黙の Order2
が使用されます。 Order1
が memory_order_acq_rel
の場合、Order2
は memory_order_acquire
です。 Order1
が memory_order_release
の場合、Order2
は memory_order_relaxed
です。 他のすべての場合、Order2
は Order1
と等しくなります。
2 つの memory_order
パラメーターを受け取るオーバーロードの場合、Order2
の値は memory_order_release
または memory_order_acq_rel
ではない必要があり、かつ Order1
の値よりも強い値でない必要があります。
atomic::compare_exchange_weak
*this
で弱いアトミックの比較および交換操作を実行します。
bool compare_exchange_weak(
Ty& Exp,
Ty Value,
memory_order Order1,
memory_order Order2
) volatile noexcept;
bool compare_exchange_weak(
Ty& Exp,
Ty Value,
memory_order Order1,
memory_order Order2
) noexcept;
bool compare_exchange_weak(
Ty& Exp,
Ty Value,
memory_order Order1 = memory_order_seq_cst
) volatile noexcept;
bool compare_exchange_weak(
Ty& Exp,
Ty Value,
memory_order Order1 = memory_order_seq_cst
) noexcept;
パラメーター
Exp
Ty
型の値。
Value
Ty
型の値。
Order1
最初の memory_order
引数。
Order2
2 番目の memory_order
引数。
戻り値
値の比較の結果を示す bool
。
解説
このアトミックの比較および交換の操作では、*this
に格納されている値と Exp
が比較されます。 値が等しい場合、操作では、読み取り/変更/書き込み操作を使用して、Order1
によって指定されたメモリ順序制約を適用することで、*this
に格納された値が Value
に置き換えられます。 値が等しくない場合、操作では *this
に格納されている値を使用して Exp
が置き換えられ、Order2
によって指定されたメモリ順序制約が適用されます。
比較された値が同一の場合、弱いアトミック比較および交換操作は交換を実行します。 値が同じでない場合、操作による交換の実行は保証されません。
2 番目の memory_order
がないオーバーロードでは、Order1
の値に基づく暗黙の Order2
が使用されます。 Order1
が memory_order_acq_rel
の場合、Order2
は memory_order_acquire
です。 Order1
が memory_order_release
の場合、Order2
は memory_order_relaxed
です。 他のすべての場合、Order2
は Order1
と等しくなります。
2 つの memory_order
パラメーターを受け取るオーバーロードの場合、Order2
の値は memory_order_release
または memory_order_acq_rel
ではない必要があり、かつ Order1
の値よりも強い値でない必要があります。
atomic::exchange
格納されている *this
の値を置き換えるために指定された値が使用されます。
Ty atomic<Ty>::exchange(
Ty Value,
memory_order Order = memory_order_seq_cst
) volatile noexcept;
Ty atomic<Ty>::exchange(
Ty Value,
memory_order Order = memory_order_seq_cst
) noexcept;
パラメーター
Value
Ty
型の値。
Order
memory_order
です。
戻り値
交換前の *this
の格納された値。
解説
この操作は、 Value
を使用して、 *this
に格納されている値を、 Order
で指定されたメモリ制約内で置き換える読み取り/変更/書き込み操作を実行します。
atomic::fetch_add
*this
に格納されている値をフェッチし、指定した値を格納された値に追加します。
Ty atomic<Ty>::fetch_add (
Ty Value,
memory_order Order = memory_order_seq_cst
) volatile noexcept;
Ty atomic<Ty>::fetch_add (
Ty Value,
memory_order Order = memory_order_seq_cst
) noexcept;
パラメーター
Value
Ty
型の値。
Order
memory_order
です。
戻り値
追加する前に*this
に格納されている値を格納するTy
オブジェクト。
解説
fetch_add
メソッドでは、Value
を *this
に格納されている値にアトミックに追加する読み取り/変更/書き込み操作が実行され、Order
で指定されているメモリ制約が適用されます。
atomic::fetch_and
値と *this
に格納されている既存の値にビットごとの "AND" (&
) を実行します。
Ty atomic<Ty>::fetch_and (
Ty Value,
memory_order Order = memory_order_seq_cst
) volatile noexcept;
Ty atomic<Ty>::fetch_and (
Ty Value,
memory_order Order = memory_order_seq_cst
) noexcept;
パラメーター
Value
Ty
型の値。
Order
memory_order
です。
戻り値
ビットごとの "AND" (&
) の結果を格納する Ty
オブジェクト。
解説
fetch_and
メソッドでは、格納されている *this
の値を Value
のビットごとの "AND" (&
) と *this
に格納されている現在の値に置き換える読み取り/変更/書き込み操作が、Order
によって指定されたメモリ制約内で実行されます。
atomic::fetch_or
値と *this
に格納されている既存の値にビットごとの "OR" (|
) を実行します。
Ty atomic<Ty>::fetch_or (
Ty Value,
memory_order Order = memory_order_seq_cst
) volatile noexcept;
Ty atomic<Ty>::fetch_or (
Ty Value,
memory_order Order = memory_order_seq_cst
) noexcept;
パラメーター
Value
Ty
型の値。
Order
memory_order
です。
戻り値
ビットごとの "OR" (|
) の結果を格納する Ty
オブジェクト。
解説
fetch_or
メソッドでは、格納されている *this
の値を Value
のビットごとの "OR" (|
) と *this
に格納されている現在の値に置き換える読み取り/変更/書き込み操作が、Order
によって指定されたメモリ制約内で実行されます。
atomic::fetch_sub
指定された値を、格納されている 値から減算します。
Ty atomic<Ty>::fetch_sub (
Ty Value,
memory_order Order = memory_order_seq_cst
) volatile noexcept;
Ty atomic<Ty>::fetch_sub (
Ty Value,
memory_order Order = memory_order_seq_cst
) noexcept;
パラメーター
Value
Ty
型の値。
Order
memory_order
です。
戻り値
減算の結果を格納する Ty
オブジェクト。
解説
fetch_sub
メソッドでは、Order
で指定されたメモリ制約内で、*this
に格納されている値から Value
をアトミックに減算するための読み取り/変更/書き込み操作が実行されます。
atomic::fetch_xor
値と *this
に格納されている既存の値にビットごとの "排他的 OR" (^
) を実行します。
Ty atomic<Ty>::fetch_xor (
Ty Value,
memory_order Order = memory_order_seq_cst
) volatile noexcept;
Ty atomic<Ty>::fetch_xor (
Ty Value,
memory_order Order = memory_order_seq_cst
) noexcept;
パラメーター
Value
Ty
型の値。
Order
memory_order
です。
戻り値
ビットごとの "排他的 OR" (^
) の結果を格納する Ty
オブジェクト。
解説
fetch_xor
メソッドでは、格納されている *this
の値を Value
のビットごとの "排他的 OR" (^
) と *this
に格納されている現在の値に置き換える読み取り/変更/書き込み操作が実行され、Order
によって指定されたメモリ制約が適用されます。
atomic::is_lock_free
*this
に対する atomic
操作がロック制御不要であるかどうかを指定します。
bool is_lock_free() const volatile noexcept;
戻り値
*this
に対する atomic
操作がロック制御不要の場合は true
、それ以外の場合は false
。
解説
その型に対する atomic
操作においてロックが使用されない場合、atomic
型はロック制御不要になります。
atomic::load
指定されたメモリ制約内で、*this
に格納されている値を取得します。
Ty atomic::load(
memory_order Order = memory_order_seq_cst
) const volatile noexcept;
Ty atomic::load(
memory_order Order = memory_order_seq_cst
) const noexcept;
パラメーター
Order
memory_order
です。 Order
を memory_order_release
または memory_order_acq_rel
にすることはできません。
戻り値
*this
に格納された取得された値。
atomic::store
指定された値を格納します。
void atomic<Ty>::store(
Ty Value,
memory_order Order = memory_order_seq_cst
) volatile noexcept;
void atomic<Ty>::store(
Ty Value,
memory_order Order = memory_order_seq_cst
) noexcept;
パラメーター
Value
Ty
オブジェクト。
Order
memory_order
制約。
解説
このメンバー関数では、Order
によって指定されたメモリ制約内で、Value
が *this
にアトミックに格納されます。