<atomic>

アトミック操作をサポートする型を作成するために使用するクラスとクラス テンプレートを定義します。

構文

#include <atomic>

解説

Note

/clr:pure を使用してコンパイルされたコードでは、このヘッダーはブロックされます。 /clr:pure/clr:safe は、Visual Studio 2017 以降のバージョンで非推奨とされます。

アトミック操作には、mutex ロックを使用せずに、複数のスレッドを使用してオブジェクトを正しく操作することに役立つ 2 つの主要なプロパティがあります。

  • アトミック操作は分割不可能なため、別のスレッドからの同じオブジェクトでの 2 つ目のアトミック操作では、最初のアトミック操作の前後にのみ、オブジェクトの状態を取得できます。

  • アトミック操作はその memory_order 引数に基づいて、同一スレッド内の他のアトミック操作の効果の可視性に対して順序要件を確立します。 そのため、順序要件に違反するコンパイラの最適化を抑制します。

一部のプラットフォームでは、mutex を使用しないと、一部の型にアトミック操作を効率的に実装できない場合があります。 その型に対してロックを使用するアトミック操作がない場合、アトミック型は lock-free になります。

C++11: シグナル ハンドラーでは、obj.is_lock_free() または atomic_is_lock_free(x)true の場合、オブジェクト obj でのアトミック操作を実行できます。

クラス atomic_flag は、bool フラグを保持する最小のアトミック型を提供します。 その操作は常にロック制御不要です。

クラス テンプレート atomic<T> はその引数の型 T のオブジェクトを格納し、その格納されている値へのアトミック アクセスを提供します。 これは、memcpy を使用してコピーでき、memcmp を使用して等価性をテストできる任意の型を使用してインスタンス化することができます。 具体的には、これらの要件を満たすユーザー定義の型と、多くの場合、浮動小数点型で使用できます。

テンプレートには、整数型の一連の特殊化およびポインターの部分的特殊化もあります。 これらの特殊化は、プライマリ テンプレートを通じて提供されていないその他の操作を提供します。

ポインターの特殊化

atomic<T *> の部分的特殊化は、すべてのポインター型に適用されます。 これらはポインター演算のメソッドを提供します。

整数の特殊化

atomic<integral> の特殊化は、すべての整数型に適用されます。 これらは、プライマリ テンプレートを通じて提供されていないその他の操作を提供します。

atomic<integral> 型には、if directive でコンパイル時にその型に対する操作がロック制御不要かどうかを判断するために使用できる対応するマクロがあります。 マクロの値が 0 の場合、その型での操作はロック制御不要ではありません。 値が 1 の場合は、操作がロック制御不要の可能性があり、ランタイム チェックが必要です。 値が 2 の場合は、操作はロック制御不要です。 関数 atomic_is_lock_free を使用して、実行時にその型での操作がロック制御不要かどうかを判断することができます。

各整数型には、その整数型のオブジェクトを管理する対応する名前付きのアトミック型があります。 各 atomic_integral 型には、atomic<T> の対応するインスタンス化と同じメンバー関数のセットがあり、任意の非メンバーのアトミック関数に渡すことができます。

atomic_integral の型 整数型 atomic_is_lock_free マクロ
atomic_char char ATOMIC_CHAR_LOCK_FREE
atomic_schar signed char ATOMIC_CHAR_LOCK_FREE
atomic_uchar unsigned char ATOMIC_CHAR_LOCK_FREE
atomic_char16_t char16_t ATOMIC_CHAR16_T_LOCK_FREE
atomic_char32_t char32_t ATOMIC_CHAR32_T_LOCK_FREE
atomic_wchar_t wchar_t ATOMIC_WCHAR_T_LOCK_FREE
atomic_short short ATOMIC_SHORT_LOCK_FREE
atomic_ushort unsigned short ATOMIC_SHORT_LOCK_FREE
atomic_int int ATOMIC_INT_LOCK_FREE
atomic_uint unsigned int ATOMIC_INT_LOCK_FREE
atomic_long long ATOMIC_LONG_LOCK_FREE
atomic_ulong unsigned long ATOMIC_LONG_LOCK_FREE
atomic_llong long long ATOMIC_LLONG_LOCK_FREE
atomic_ullong unsigned long long ATOMIC_LLONG_LOCK_FREE

Typedef 名は、ヘッダー <inttypes.h> で定義されている一部の型のアトミック テンプレートの特殊化のために存在します。

アトミック型 Typedef Name
atomic_int8_t atomic<int8_t>
atomic_uint8_t atomic<uint8_t>
atomic_int16_t atomic<int16_t>
atomic_uint16_t atomic<uint16_t>
atomic_int32_t atomic<int32_t>
atomic_uint32_t atomic<uint32_t>
atomic_int64_t atomic<int64_t>
atomic_uint64_t atomic<uint64_t>
atomic_int_least8_t atomic<int_least8_t>
atomic_uint_least8_t atomic<uint_least8_t>
atomic_int_least16_t atomic<int_least16_t>
atomic_uint_least16_t atomic<uint_least16_t>
atomic_int_least32_t atomic<int_least32_t>
atomic_uint_least32_t atomic<uint_least32_t>
atomic_int_least64_t atomic<int_least64_t>
atomic_uint_least64_t atomic<uint_least64_t>
atomic_int_fast8_t atomic<int_fast8_t>
atomic_uint_fast8_t atomic<uint_fast8_t>
atomic_int_fast16_t atomic<int_fast16_t>
atomic_uint_fast16_ atomic<uint_fast16_t>
atomic_int_fast32_t atomic<int_fast32_t>
atomic_uint_fast32_t atomic<uint_fast32_t>
atomic_int_fast64_t atomic<int_fast64_t>
atomic_uint_fast64_t atomic<uint_fast64_t>
atomic_intptr_t atomic<intptr_t>
atomic_uintptr_t atomic<uintptr_t>
atomic_size_t atomic<size_t>
atomic_ptrdiff_t atomic<ptrdiff_t>
atomic_intmax_t atomic<intmax_t>
atomic_uintmax_t atomic<uintmax_t>

構造体

名前 説明
atomic 構造体 格納された値に対して atomic 操作を実行するオブジェクトについて記述します。
atomic_flag 構造体 bool フラグをアトミックに設定およびクリアするオブジェクトについて記述します。

列挙型

名前 説明
memory_order 列挙型 メモリ位置に対する同期操作のシンボル名を提供します。 これらの操作は、1 つのスレッドの割り当てが別のスレッドにおいて表示される方法に影響します。

関数

次の一覧では、末尾が _explicit ではない関数は、memory_order_seq_cst の暗黙的な memory_order 引数を持っている場合を除き、対応する _explicit のセマンティクスを持っています。

名前 説明
atomic_compare_exchange_strong 操作を atomic compare and exchange 実行します。
atomic_compare_exchange_strong_explicit 操作を atomic compare and exchange 実行します。
atomic_compare_exchange_weak 操作を weak atomic compare and exchange 実行します。
atomic_compare_exchange_weak_explicit 操作を weak atomic compare and exchange 実行します。
atomic_exchange 格納されている値を置き換えます。
atomic_exchange_explicit 格納されている値を置き換えます。
atomic_fetch_add 指定した値を格納されている既存の値に加算します。
atomic_fetch_add_explicit 指定した値を格納されている既存の値に加算します。
atomic_fetch_and 指定されている値と格納されている既存の値でビットごとの "AND" (&) を実行します。
atomic_fetch_and_explicit 指定されている値と格納されている既存の値でビットごとの "AND" (&) を実行します。
atomic_fetch_or 指定されている値と格納されている既存の値でビットごとの "OR" (|) を実行します。
atomic_fetch_or_explicit 指定されている値と格納されている既存の値でビットごとの "OR" (|) を実行します。
atomic_fetch_sub 指定した値を格納されている既存の値から減算します。
atomic_fetch_sub_explicit 指定した値を格納されている既存の値から減算します。
atomic_fetch_xor 指定されている値と格納されている既存の値でビットごとの "排他的 OR" (^) を実行します。
atomic_fetch_xor_explicit 指定されている値と格納されている既存の値でビットごとの "排他的 OR" (^) を実行します。
atomic_flag_clear atomic_flag オブジェクト内のフラグを false に設定します。
atomic_flag_clear_explicit atomic_flag オブジェクト内のフラグを false に設定します。
atomic_flag_test_and_set atomic_flag オブジェクト内のフラグを true に設定します。
atomic_flag_test_and_set_explicit atomic_flag オブジェクト内のフラグを true に設定します。
atomic_init atomic オブジェクトに格納されている値を設定します。
atomic_is_lock_free 指定されたオブジェクトに対するアトミック操作がロック制御不要かどうかを指定します。
atomic_load アトミックに値を取得します。
atomic_load_explicit アトミックに値を取得します。
atomic_signal_fence 同じスレッドで実行されるシグナル ハンドラーを持つスレッドの呼び出しで、フェンス間のメモリ オーダリング要件を確立する fence として機能します。
atomic_store アトミックに値を格納します。
atomic_store_explicit アトミックに値を格納します。
atomic_thread_fence 他のフェンスに関するメモリ オーダリングの要件を確立する fence として機能します。
kill_dependency 可能な依存関係チェーンを切断します。

関連項目

ヘッダー ファイル リファレンス
C++ 標準ライブラリ リファレンス