std::atomic_ref
ヘッダ <atomic> で定義 | ||
template<class T > struct atomic_ref; | (1) | (C++20以上) |
template<class T > struct atomic_ref<T*>; | (2) | (C++20以上) |
std::atomic_ref
クラステンプレートはその参照先のオブジェクトにアトミック操作を適用します。 atomic_ref
オブジェクトの生存期間の間、その参照先のオブジェクトはアトミックオブジェクトとみなされます。 あるスレッドがアトミックオブジェクトに書き込み、同時に別のスレッドがそのアトミックオブジェクトから読み込む場合、その動作は well-defined です (データ競合の詳細はメモリモデルを参照してください)。 さらに、アトミックオブジェクトへのアクセスはスレッド間の同期を確立し、 std::memory_order で指定されたように非アトミックメモリアクセスを順序付けることができます。
オブジェクトの生存期間はそのオブジェクトを参照するすべての atomic_ref
の生存期間を超えなければなりません。 オブジェクトを参照する atomic_ref
のインスタンスが存在する間、そのオブジェクトは排他的にこれらの atomic_ref
のインスタンスを通してアクセスされなければなりません。 atomic_ref
オブジェクトによって参照されているオブジェクトの部分オブジェクトは他のいかなる atomic_ref
オブジェクトによっても並行的に参照されてはなりません。
atomic_ref
を通してオブジェクトに適用されるアトミック操作は、同じオブジェクトを参照する他のあらゆる atomic_ref
を通して適用されるアトミック操作に対して、アトミックです。
std::atomic_ref
は CopyConstructible です。
言語の参照と同様に、 const 性は atomic_ref
に対してシャローです。 const
な atomic_ref
オブジェクトを通した参照先の値は変更することができます。
目次 |
[編集]特殊化
[編集]プライマリテンプレート
std::atomic_ref
のプライマリテンプレートは任意の TriviallyCopyable な型 T
(bool を含む) で実体化できます。
struct Counters {int a;int b;} counter;// ユーザ定義のトリビアルにコピー可能な型 std::atomic_ref<Counters> cnt(counter);// そのユーザ定義型に対する特殊化
[編集]ポインタ型に対する部分特殊化
標準ライブラリはすべてのポインタ型に対する std::atomic_ref
テンプレートの部分特殊化を提供します。 すべてのアトミック型に対して提供される操作に加えて、これらの特殊化は fetch_add
や fetch_sub
などのポインタ型に適したアトミック算術演算を追加でサポートします。
[編集]整数型に対する特殊化
以下の整数型のいずれかで実体化したとき、 std::atomic_ref
は fetch_add
、 fetch_sub
、 fetch_and
、 fetch_or
、 fetch_xor
などの整数型に適した追加のアトミック演算を提供します。
- 文字型: char, char8_t, char16_t, char32_t, wchar_t
- 標準の符号付き整数型: signedchar, short, int, long, longlong
- 標準の符号なし整数型: unsignedchar, unsignedshort, unsignedint, unsignedlong, unsignedlonglong
- ヘッダ <cstdint> の typedef によって必要とされるあらゆる追加の整数型
符号付き整数算術は2の補数を用いて定義され、未定義の結果は発生しません。
[編集]浮動小数点型に対する特殊化
浮動小数点型 float, double, longdouble のいずれかで実体化したとき、 std::atomic_ref
は fetch_add
や fetch_sub
などの浮動小数点型に適した追加のアトミック演算を提供します。
結果がその浮動小数点型で表現できない場合であっても、いかなる演算も未定義動作を発生することはありません。 有効な浮動小数点環境は呼び出し元スレッドの浮動小数点環境と異なる場合があります。
[編集]メンバ型
メンバ型 | 定義 |
value_type | see below |
difference_type | value_type (atomic_ref<整数型> および atomic_ref<浮動小数点型> 特殊化に対してのみ)std::ptrdiff_t( atomic_ref<T*> 特殊化に対してのみ) |
すべての std::atomic_ref<X>
について (特殊化されているかいないかにかかわらず)、 std::atomic_ref<X>::value_type
は X
です。
difference_type
は atomic_ref
のプライマリテンプレートでは定義されません。
[編集]メンバ関数
atomic_ref オブジェクトを構築します (パブリックメンバ関数) | |
atomic_ref オブジェクトによって参照されるオブジェクトに値を格納します (パブリックメンバ関数) | |
atomic_ref オブジェクトがロックフリーかどうか調べます (パブリックメンバ関数) | |
参照先のオブジェクトの値を非アトミック引数でアトミックに置き換えます (パブリックメンバ関数) | |
参照先のオブジェクトの値をアトミックに取得します (パブリックメンバ関数) | |
参照先のオブジェクトから値をロードします (パブリックメンバ関数) | |
参照先のオブジェクトの値をアトミックに置き換え、以前保持されていた値を取得します (パブリックメンバ関数) | |
参照先のオブジェクトの値を非アトミック引数とアトミックに比較し、等しければアトミック交換を、等しくなければアトミックロードを行います (パブリックメンバ関数) | |
(C++20) | 通知されかつアトミック値が変更されるまでブロックします (パブリックメンバ関数) |
(C++20) | atomic_wait でブロックしているスレッドの1つに通知します (パブリックメンバ関数) |
(C++20) | atomic_wait でブロックしているすべてのスレッドに通知します (パブリックメンバ関数) |
定数 | |
型が常にロックフリーであることを表します (パブリック静的メンバ定数) | |
atomic_ref によって参照されるオブジェクトの要求されるアライメントを示します (パブリック静的メンバ定数) |
[編集]特殊化のメンバ関数
参照先のオブジェクトに格納されている値に引数をアトミックに加算し、以前保持されていた値を取得します (パブリックメンバ関数) | |
参照先のオブジェクトに格納されている値から引数をアトミックに減算し、以前保持されていた値を取得します (パブリックメンバ関数) | |
引数と参照先のオブジェクトの値の間でビット単位の論理積をアトミックに行い、以前保持されていた値を取得します (パブリックメンバ関数) | |
引数と参照先のオブジェクトの値の間でビット単位の論理和をアトミックに行い、以前保持されていた値を取得します (パブリックメンバ関数) | |
引数と参照先のオブジェクトの値の間でビット単位の排他的論理和をアトミックに行い、以前保持されていた値を取得します (パブリックメンバ関数) | |
参照先のオブジェクトをアトミックに1つインクリメントまたはデクリメントします (パブリックメンバ関数) | |
参照先の値とアトミックに加算、減算、ビット単位の論理積、ビット単位の論理和、ビット単位の排他的論理和を行います (パブリックメンバ関数) |
[編集]関連項目
(C++11) | atomic クラステンプレートと bool 型、整数型、ポインタ型に対する特殊化 (クラステンプレート) |