<atomic>

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

構文

#include <atomic>

解説

注意

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

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

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

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

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

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

クラス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 名
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_flag 構造体 フラグをアトミックに設定およびクリアするオブジェクトを記述し bool ます。

列挙型

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

関数

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

名前 説明
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 指定されている値と格納されている既存の値でビットごとの 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 指定されている値と格納されている既存の値でビットごとの exclusive or を実行します。
atomic_fetch_xor_explicit 指定されている値と格納されている既存の値でビットごとの exclusive 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 同じスレッドで実行される通知ハンドラーを持つスレッドの呼び出しで、フェンス間のメモリ オーダリング要件を確立するフェンスとして機能します。
atomic_store アトミックに値を格納します。
atomic_store_explicit アトミックに値を格納します。
atomic_thread_fence 他のフェンスに関するメモリ オーダリングの要件を確立するフェンスとして機能します。
kill_dependency 可能な依存関係チェーンを切断します。

関連項目

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