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_cstmemory_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_cstmemory_order が使用されます。

atomic::operator+=

指定された値を、格納されている 値に加算します。 整数およびポインターの特殊化でのみ使用されます。

Ty atomic<Ty>::operator+=(
   Ty Value
) volatile noexcept;
Ty atomic<Ty>::operator+=(
   Ty Value
) noexcept;

パラメーター

Value
整数値またはポインター値。

戻り値

Ty加算の結果を含むオブジェクト。

解説

この演算子では memory_order_seq_cstmemory_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_cstmemory_order が使用されます。

atomic::operator-=

指定された値を、格納されている 値から減算します。 整数およびポインターの特殊化でのみ使用されます。

Ty atomic<Ty>::operator-=(
   Ty Value
) volatile noexcept;
Ty atomic<Ty>::operator-=(
   Ty Value
) noexcept;

パラメーター

Value
整数値またはポインター値。

戻り値

減算の結果を格納する Ty オブジェクト。

解説

この演算子では memory_order_seq_cstmemory_order が使用されます。

atomic::operator&=

指定されている値と格納されている *this の値に対して、ビットごとの "AND" (&) を実行します。 整数の特殊化でのみ使用されます。

atomic<Ty>::operator&= (
   Ty Value
) volatile noexcept;
atomic<Ty>::operator&= (
   Ty Value
) noexcept;

パラメーター

Value
Ty 型の値。

戻り値

ビットごとの "AND" (&) の結果。

解説

この演算子では、格納されている *this の値を Value のビットごとの "AND" (&) と *this に格納されている現在の値に置き換える読み取り/変更/書き込み操作が、memory_order_seq_cstmemory_order の制約内で実行されます。

atomic::operator|=

指定されている値と格納されている *this の値に対して、ビットごとの "OR" (|) を実行します。 整数の特殊化でのみ使用されます。

atomic<Ty>::operator|= (
   Ty Value
) volatile noexcept;
atomic<Ty>::operator|= (
   Ty Value
) noexcept;

パラメーター

Value
Ty 型の値。

戻り値

ビットごとの "OR" (|) の結果。

解説

この演算子では、格納されている *this の値を Value のビットごとの "OR" (|) と *this に格納されている現在の値に置き換える読み取り/変更/書き込み操作が、memory_order_seq_cstmemory_order の制約内で実行されます。

atomic::operator^=

指定されている値と格納されている *this の値に対して、ビットごとの "排他的 OR" (^) を実行します。 整数の特殊化でのみ使用されます。

atomic<Ty>::operator^= (
   Ty Value
) volatile noexcept;
atomic<Ty>::operator^= (
   Ty Value
) noexcept;

パラメーター

Value
Ty 型の値。

戻り値

ビットごとの "排他的 OR" (^) の結果。

解説

この演算子では、格納されている *this の値を Value のビットごとの "排他的 OR" (^) と *this に格納されている現在の値に置き換える読み取り/変更/書き込み操作が、memory_order_seq_cstmemory_order の制約内で実行されます。

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 が使用されます。 Order1memory_order_acq_rel の場合、Order2memory_order_acquire です。 Order1memory_order_release の場合、Order2memory_order_relaxed です。 他のすべての場合、Order2Order1 と等しくなります。

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 が使用されます。 Order1memory_order_acq_rel の場合、Order2memory_order_acquire です。 Order1memory_order_release の場合、Order2memory_order_relaxed です。 他のすべての場合、Order2Order1 と等しくなります。

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、指定されたOrderメモリ制約内に*this格納されている値を置き換えます。

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

戻り値

Ty加算の前に格納された*this値を含むオブジェクト。

解説

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 です。 Ordermemory_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 にアトミックに格納されます。

関連項目

<atomic>
ヘッダー ファイル リファレンス