Namespaces
Variants

std:: atomic_ref

From cppreference.net
Concurrency support library
Threads
(C++11)
(C++20)
this_thread namespace
(C++11)
(C++11)
Cooperative cancellation
Mutual exclusion
Generic lock management
Condition variables
(C++11)
Semaphores
Latches and Barriers
(C++20)
(C++20)
Futures
(C++11)
(C++11)
(C++11)
Safe reclamation
Hazard pointers
Atomic types
(C++11)
atomic_ref
(C++20)
Initialization of atomic types
(C++11) (deprecated in C++20)
(C++11) (deprecated in C++20)
Memory ordering
(C++11) (deprecated in C++26)
Free functions for atomic operations
Free functions for atomic flags
ヘッダーで定義 <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性は浅い( shallow )です - const std::atomic_ref オブジェクトを通じて参照先の値を変更することが可能です。

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

std::atomic_ref CopyConstructible です。

目次

ネスト型

定義
value_type std:: remove_cv_t < T >
difference_type
  • value_type 、ただし T cv bool 以外の算術型の場合
  • それ以外の場合、 std::ptrdiff_t 、ただし T がオブジェクトポインタ型の場合
  • それ以外の場合、定義されない

データメンバ

メンバー 説明
T * ptr 参照されるオブジェクトへのポインタ
( 説明専用メンバーオブジェクト* )
型が常にロックフリーであることを示す
(公開静的メンバー定数)
atomic_ref によって参照されるオブジェクトに必要なアライメントを示す
(公開静的メンバー定数)

メンバー関数

atomic_ref オブジェクトを構築する
(公開メンバ関数)
atomic_ref オブジェクトによって参照されるオブジェクトに値を格納する
(公開メンバ関数)
atomic_ref オブジェクトがロックフリーかどうかをチェックする
(公開メンバ関数)
参照先オブジェクトの値を非アトミックな引数でアトミックに置き換えます
(公開メンバ関数)
参照先オブジェクトの値をアトミックに取得する
(公開メンバ関数)
参照先オブジェクトから値をロードする
(公開メンバ関数)
参照先オブジェクトの値をアトミックに置換し、以前に保持されていた値を取得する
(公開メンバ関数)
参照先オブジェクトの値を非アトミック引数とアトミックに比較し、等しい場合はアトミック交換を、等しくない場合はアトミック読み込みを実行する
(公開メンバ関数)
通知を受けてアトミック値が変更されるまでスレッドをブロックする
(公開メンバ関数)
アトミックオブジェクトを待機している少なくとも1つのスレッドに通知する
(公開メンバ関数)
アトミックオブジェクトの待機でブロックされているすべてのスレッドを通知する
(公開メンバ関数)
(C++26)
オブジェクトのアドレスを返す
(公開メンバ関数)
Tが算術型であり、かつcv修飾されたbool型またはオブジェクトへのポインタ型ではない場合にのみ提供される
参照先オブジェクトに格納された値に引数をアトミックに加算し、以前に保持されていた値を取得します
(公開メンバ関数)
参照先オブジェクトに格納された値から引数をアトミックに減算し、以前に保持されていた値を取得します
(public member function)
参照先の値に対して原子的に加算または減算を行います
(公開メンバ関数)
T cv bool またはオブジェクトへのポインタ型以外の整数型である場合にのみ提供される
(C++26)
引数と参照先オブジェクトの値の間で std::max をアトミックに実行し、以前に保持されていた値を取得する
(公開メンバ関数)
(C++26)
引数と参照先オブジェクトの値の間で std::min をアトミックに実行し、以前に保持されていた値を取得する
(公開メンバ関数)
参照先のオブジェクトをアトミックに1つインクリメントまたはデクリメントします
(公開メンバ関数)
Tがcv修飾されたbool以外の整数型である場合にのみ提供される T is an integral type other than cv bool
引数と参照先オブジェクトの値との間でビット単位のANDをアトミックに実行し、以前に保持されていた値を取得します
(公開メンバ関数)
引数と参照先オブジェクトの値との間でビット単位の論理和をアトミックに実行し、以前に保持されていた値を取得します
(公開メンバ関数)
引数と参照先オブジェクトの値との間でビット単位XORをアトミックに実行し、以前に保持されていた値を取得します
(公開メンバ関数)
参照先の値に対してビット単位のAND、OR、XORをアトミックに実行します
(公開メンバ関数)

特殊化

C++標準では、 std::atomic_ref には以下の特殊化が規定されています:

template <>
struct atomic_ref < /*integral-type*/ > ;
(1) (C++20以降)
template <>
struct atomic_ref < /*floating-point-type*/ > ;
(2) (C++20以降)
template < class /*pointer-type*/ >

requires /* 下記参照 */

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

注記

実装は指定された特殊化を統合する場合があります。例: 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)
atomicクラステンプレートとbool、整数型、 浮動小数点型、 (C++20以降) ポインタ型の特殊化
(クラステンプレート)