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性は浅い( shallow )です -
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]
|
型が常にロックフリーであることを示す
(公開静的メンバー定数) |
|
[static]
|
atomic_ref
によって参照されるオブジェクトに必要なアライメントを示す
(公開静的メンバー定数) |
メンバー関数
atomic_ref
オブジェクトを構築する
(公開メンバ関数) |
|
atomic_ref
オブジェクトによって参照されるオブジェクトに値を格納する
(公開メンバ関数) |
|
atomic_ref
オブジェクトがロックフリーかどうかをチェックする
(公開メンバ関数) |
|
|
参照先オブジェクトの値を非アトミックな引数でアトミックに置き換えます
(公開メンバ関数) |
|
|
参照先オブジェクトの値をアトミックに取得する
(公開メンバ関数) |
|
|
参照先オブジェクトから値をロードする
(公開メンバ関数) |
|
|
参照先オブジェクトの値をアトミックに置換し、以前に保持されていた値を取得する
(公開メンバ関数) |
|
|
参照先オブジェクトの値を非アトミック引数とアトミックに比較し、等しい場合はアトミック交換を、等しくない場合はアトミック読み込みを実行する
(公開メンバ関数) |
|
|
通知を受けてアトミック値が変更されるまでスレッドをブロックする
(公開メンバ関数) |
|
|
アトミックオブジェクトを待機している少なくとも1つのスレッドに通知する
(公開メンバ関数) |
|
|
アトミックオブジェクトの待機でブロックされているすべてのスレッドを通知する
(公開メンバ関数) |
|
|
(C++26)
|
オブジェクトのアドレスを返す
(公開メンバ関数) |
Tが算術型であり、かつcv修飾されたbool型またはオブジェクトへのポインタ型ではない場合にのみ提供される |
|
|
参照先オブジェクトに格納された値に引数をアトミックに加算し、以前に保持されていた値を取得します
(公開メンバ関数) |
|
|
参照先オブジェクトに格納された値から引数をアトミックに減算し、以前に保持されていた値を取得します
(public member function) |
|
|
参照先の値に対して原子的に加算または減算を行います
(公開メンバ関数) |
|
|
|
|
(C++26)
|
引数と参照先オブジェクトの値の間で
std::max
をアトミックに実行し、以前に保持されていた値を取得する
(公開メンバ関数) |
|
(C++26)
|
引数と参照先オブジェクトの値の間で
std::min
をアトミックに実行し、以前に保持されていた値を取得する
(公開メンバ関数) |
|
参照先のオブジェクトをアトミックに1つインクリメントまたはデクリメントします
(公開メンバ関数) |
|
Tが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
/* 下記参照 */
|
(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)
|
atomicクラステンプレートとbool、整数型、
浮動小数点型、
(C++20以降)
ポインタ型の特殊化
(クラステンプレート) |