名前空間
変種
操作

std::atomic_ref

From cppreference.com
< cpp‎ | atomic
 
 
並行性サポートライブラリ
スレッド
(C++11)
(C++20)
this_thread 名前空間
(C++11)
(C++11)
(C++11)
協調的なキャンセル
排他制御
(C++11)
汎用ロック管理
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
条件変数
(C++11)
セマフォ
ラッチとバリア
(C++20)
(C++20)
future
(C++11)
(C++11)
(C++11)
(C++11)
安全なメモリ解放 (Safe Reclamation)
(C++26)
ハザードポインタ
アトミック型
(C++11)
atomic_ref
(C++20)
アトミック型の初期化
(C++11)(C++20で非推奨)
(C++11)(C++20で非推奨)
メモリオーダー
(C++11)(C++26で非推奨)
アトミック操作のためのフリー関数
アトミックフラグのためのフリー関数
 
 
ヘッダー <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性は浅いです。つまり、conststd::atomic_refオブジェクトを通じて参照先の値を変更することが可能です。

以下のいずれかの条件が満たされる場合、プログラムは不適格となります

std::atomic_refCopyConstructibleです。

目次

[編集] ネストされた型

定義
value_type std::remove_cv_t<T>
difference_type
  • Tcv bool以外の算術型である場合、value_type
  • それ以外の場合で、Tがオブジェクトへのポインタ型である場合、std::ptrdiff_t
  • それ以外の場合は定義されない。

[編集] データメンバ

メンバ 説明
T* ptr 参照されるオブジェクトへのポインタ
(説明用のメンバオブジェクト*)
型が常にロックフリーであることを示す
(public static member constant) [編集]
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) [編集]
Tcv bool以外の算術型またはオブジェクトへのポインタ型の場合にのみ提供される
参照されるオブジェクトに格納されている値に引数をアトミックに加算し、以前保持されていた値を取得する
(public member function) [編集]
参照されるオブジェクトに格納されている値から引数をアトミックに減算し、以前保持されていた値を取得する
(public member function) [編集]
参照される値にアトミックに加算または減算する
(public member function) [編集]
Tcv bool以外の整数型またはオブジェクトへのポインタ型の場合にのみ提供される
(C++26)
参照されるオブジェクトの値と引数との間でstd::maxをアトミックに実行し、以前保持されていた値を取得する
(public member function) [編集]
(C++26)
参照されるオブジェクトの値と引数との間でstd::minをアトミックに実行し、以前保持されていた値を取得する
(public member function) [編集]
参照されるオブジェクトをアトミックに1だけインクリメントまたはデクリメントする
(public member function) [編集]
Tcv bool以外の整数型の場合にのみ提供される
参照されるオブジェクトの値と引数との間でビット単位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 /* 以下を参照 */

struct atomic_ref</*ポインタ型*/>;
(3) (C++20以降)
1) /*整数型*/ は、cv修飾されている可能性のある、cv bool以外の整数型を表します。
2) /*浮動小数点型*/ は、cv修飾されている可能性のある浮動小数点型を表します。
3) 部分特殊化は、cv修飾されている可能性のあるオブジェクトへのポインタ型である/*ポインタ型*/に対して提供されます。

[編集] ノート

実装は、指定された特殊化を統合することがあります。例:MSVC STLはそれらすべてをプライマリテンプレートに統合しています。

Tcv 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::atomicstd::atomic_ref

[編集] 欠陥報告

以下の動作変更を伴う欠陥報告が、以前に公開されたC++標準に遡って適用されました。

DR 適用対象 公開された動作 正しい動作
LWG 3508
(P3323R1)
C++20 atomic_ref<T> には実装不可能な操作があった
Tconst型または非オブジェクトへのポインタ型の場合
これらの操作は制約されるか
または不適切なTに対しては提供されない

[編集] 関連項目

(C++11)
アトミッククラステンプレートと、bool、整数、浮動小数点数、(C++20以降)、ポインタ型のための特殊化
(クラステンプレート) [編集]
English 日本語 中文(简体) 中文(繁體)