std::atomic_ref
| ヘッダー <atomic> で定義 |
||
| template< class T > struct atomic_ref; |
(C++20以降) | |
std::atomic_refクラステンプレートは、それが参照するオブジェクトにアトミック操作を適用します。
std::atomic_refオブジェクトの生存期間中、それが参照するオブジェクトはアトミックオブジェクトとみなされます。あるスレッドがアトミックオブジェクトに書き込み、同時に別のスレッドがそこから読み取る場合、その動作は未定義ではありません(データ競合の詳細についてはメモリモデルを参照)。さらに、アトミックオブジェクトへのアクセスは、std::memory_orderで指定されるように、スレッド間の同期を確立し、非アトミックなメモリアクセスを順序付けることができます。
オブジェクトの生存期間は、そのオブジェクトを参照するすべてのstd::atomic_refの生存期間を超えなければなりません。オブジェクトを参照するstd::atomic_refインスタンスが存在する間、そのオブジェクトはこれらのstd::atomic_refインスタンスを介して排他的にアクセスされなければなりません。std::atomic_refオブジェクトによって参照されるオブジェクトのサブオブジェクトは、他のどのstd::atomic_refオブジェクトによっても同時に参照されてはなりません。
std::atomic_refを介してオブジェクトに適用されるアトミック操作は、同じオブジェクトを参照する他のstd::atomic_refを介して適用されるアトミック操作に対してアトミックです。
コア言語の参照と同様に、std::atomic_refのconst性は浅いです。つまり、constのstd::atomic_refオブジェクトを通じて参照先の値を変更することが可能です。
以下のいずれかの条件が満たされる場合、プログラムは不適格となります
- std::is_trivially_copyable_v<T> が false である。
-
is_always_lock_freeが false であり、かつ std::is_volatile_v<T> が true である。
std::atomic_refはCopyConstructibleです。
目次 |
[編集] ネストされた型
| 型 | 定義 |
value_type
|
std::remove_cv_t<T> |
difference_type
|
|
[編集] データメンバ
| メンバ | 説明 |
T* ptr |
参照されるオブジェクトへのポインタ (説明用のメンバオブジェクト*) |
| [static] |
型が常にロックフリーであることを示す (public static member constant) |
| [static] |
atomic_refによって参照されるオブジェクトに必要なアライメントを示す(public static member constant) |
[編集] メンバ関数
atomic_refオブジェクトを構築する(public member function) | |
atomic_refオブジェクトが参照するオブジェクトに値を格納する(public member function) | |
atomic_refオブジェクトがロックフリーであるかを確認する(public member function) | |
| 参照されるオブジェクトの値を非アトミックな引数でアトミックに置き換える (public member function) | |
| 参照されるオブジェクトの値をアトミックに取得する (public member function) | |
| 参照されるオブジェクトから値をロードする (public member function) | |
| 参照されるオブジェクトの値をアトミックに置き換え、以前保持されていた値を取得する (public member function) | |
| 参照されるオブジェクトの値を非アトミックな引数とアトミックに比較し、等しい場合はアトミックな交換を、等しくない場合はアトミックなロードを実行する (public member function) | |
| 通知されるまで、かつアトミックな値が変更されるまでスレッドをブロックする (public member function) | |
| アトミックオブジェクトを待機しているスレッドを少なくとも1つ通知する (public member function) | |
| アトミックオブジェクトを待機してブロックされている全てのスレッドに通知する (public member function) | |
| (C++26) |
オブジェクトのアドレスを返す (public member function) |
| |
| 参照されるオブジェクトに格納されている値に引数をアトミックに加算し、以前保持されていた値を取得する (public member function) | |
| 参照されるオブジェクトに格納されている値から引数をアトミックに減算し、以前保持されていた値を取得する (public member function) | |
| 参照される値にアトミックに加算または減算する (public member function) | |
| |
| (C++26) |
参照されるオブジェクトの値と引数との間でstd::maxをアトミックに実行し、以前保持されていた値を取得する (public member function) |
| (C++26) |
参照されるオブジェクトの値と引数との間でstd::minをアトミックに実行し、以前保持されていた値を取得する (public member function) |
| 参照されるオブジェクトをアトミックに1だけインクリメントまたはデクリメントする (public member function) | |
| |
| 参照されるオブジェクトの値と引数との間でビット単位ANDをアトミックに実行し、以前保持されていた値を取得する (public member function) | |
| 参照されるオブジェクトの値と引数との間でビット単位ORをアトミックに実行し、以前保持されていた値を取得する (public member function) | |
| 参照されるオブジェクトの値と引数との間でビット単位XORをアトミックに実行し、以前保持されていた値を取得する (public member function) | |
| 参照される値とビット単位AND、OR、XORをアトミックに実行する (public member function) | |
[編集] 特殊化
標準では、std::atomic_refは以下の特殊化を持つと規定されています
| template<> struct atomic_ref</*整数型*/>; |
(1) | (C++20以降) |
| template<> struct atomic_ref</*浮動小数点型*/>; |
(2) | (C++20以降) |
| template< class /*ポインタ型*/ > requires /* 以下を参照 */ |
(3) | (C++20以降) |
[編集] ノート
実装は、指定された特殊化を統合することがあります。例:MSVC STLはそれらすべてをプライマリテンプレートに統合しています。
Tがcv voidまたは関数型の場合、std::atomic_ref<T*>(すなわちstd::atomic_ref<void*>、std::atomic_ref<int(*)()>など)は、difference_typeやポインタ演算または関係比較(C++26から)を必要とするいかなる操作も持ちません。
| 機能テストマクロ | 値 | 規格 | 機能 |
|---|---|---|---|
__cpp_lib_atomic_ref |
201806L |
(C++20) | std::atomic_ref
|
__cpp_lib_constexpr_atomic |
202411L |
(C++26) | constexpr std::atomicとstd::atomic_ref |
[編集] 欠陥報告
以下の動作変更を伴う欠陥報告が、以前に公開されたC++標準に遡って適用されました。
| DR | 適用対象 | 公開された動作 | 正しい動作 |
|---|---|---|---|
| LWG 3508 (P3323R1) |
C++20 | atomic_ref<T> には実装不可能な操作があったTがconst型または非オブジェクトへのポインタ型の場合 |
これらの操作は制約されるか または不適切な Tに対しては提供されない |
[編集] 関連項目
| (C++11) |
アトミッククラステンプレートと、bool、整数、浮動小数点数、(C++20以降)、ポインタ型のための特殊化 (クラステンプレート) |