<atomic>

クラスとテンプレート クラスを分割できない操作をサポートする型を作成するように定義します。

#include <atomic>

解説

[!メモ]

/clr/clr:pureを使用してコンパイルされたコードでは、このヘッダーはブロックされます。

分割不可能な操作に正しくミューテックスのロックを使用せずに、オブジェクトを処理するには、複数のスレッドを使用できる2種類の主要なプロパティがあります。

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

  • memory_order の引数に基づいて、分割不可能な操作は、同じスレッドに他のアトミック操作の効果を表示する手順の条件を設定します。その結果、命令の要件に違反するコンパイラの最適化を禁じます。

一部のプラットフォームでは、効率的に mutex のロックを使用せずに、型の分割不可能な操作を実行することができない可能性があります。アトミック型は、その型の使用のアトミック操作がロックする ロック制御不要 です。

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

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

テンプレートには、一連の整数型の特殊化とポインターの部分的特殊化があります。これらの特化がプライマリ テンプレートからは利用できない追加の操作を提供します。

ポインターの特殊化

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

必要な特殊化

atomic<integral> の特殊化を必要なすべての型に適用します。これらはプライマリ テンプレートからは利用できない追加の操作を提供します。

atomic<integral> の各型には、その型の操作はロック制御不要であるかどうか、コンパイル時に確認するには、if directive で使用できる対応するマクロがあります。マクロの値がゼロの場合、型の操作は、ロック制御なしではありません。値が1の場合、演算は、ロック制御なしでない可能性もあるのでランタイム チェックが必要です。値が2の場合、演算はロック制御不要です。型の操作がロック制御不要であるかどうかを実行時に確認するには atomic_is_lock_free 関数を使用できます。

整数型の場合、その整数型のオブジェクトを管理する、対応する名前付き分割不可能な種類があります。atomic_integral の種類に対応する atomic<Ty> のインスタンス化にメンバー関数のセットがあり、非メンバーのアトミック関数に渡すことができます。

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_flag の構造

アトミックに設定される bool のフラグをクリアするオブジェクトについて説明します。

列挙型

名前

説明

memory_order の列挙

メモリ位置の同期操作でシンボル名を指定します。これらの操作は1種類のスレッドの割り当てを別の要素に表示されるように変換するかに影響します。

関数

次の一覧では、_explicit で終了関数に対応する _explicitセマンティクスが、あります。memory_order_seq_cstの memory_order の暗黙の引数があります。

名前

説明

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 関数

falseへの atomic_flag のオブジェクトにフラグを設定します。

atomic_flag_clear_explicit 関数

falseへの atomic_flag のオブジェクトにフラグを設定します。

atomic_flag_test_and_set 関数

trueへの atomic_flag のオブジェクトにフラグを設定します。

atomic_flag_test_and_set_explicit 関数

trueへの atomic_flag のオブジェクトにフラグを設定します。

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 関数

可能な依存関係チェーンを中断します。

参照

関連項目

標準テンプレート ライブラリ

その他の技術情報

ヘッダー ファイル