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 的 constness 是浅的——可以通过 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 |
指向被引用对象的指针 (仅用于阐释的成员对象*) |
| 指示该类型始终是无锁的 (公共静态成员常量) | |
指示 atomic_ref 引用的对象所需的对齐方式(公共静态成员常量) |
[编辑] 成员函数
构造一个 atomic_ref 对象(公共成员函数) | |
将一个值存储到 atomic_ref 对象引用的对象中(公共成员函数) | |
检查 atomic_ref 对象是否是无锁的(公共成员函数) | |
| 原子地用非原子参数替换被引用对象的值 (公共成员函数) | |
| 原子地获取被引用对象的值 (公共成员函数) | |
| 从被引用对象加载值 (公共成员函数) | |
| 原子地替换被引用对象的值并获取先前持有的值 (公共成员函数) | |
| 原子地将被引用对象的值与非原子参数进行比较,如果相等则执行原子交换,否则执行原子加载 (公共成员函数) | |
| 阻塞线程直到被通知且原子值改变 (公共成员函数) | |
| 通知至少一个等待原子对象的线程 (公共成员函数) | |
| 通知所有被原子对象阻塞的线程 (公共成员函数) | |
| (C++26) |
返回对象的地址 (公共成员函数) |
仅当
| |
| 原子地将参数添加到被引用对象中存储的值,并获取先前持有的值 (公共成员函数) | |
| 原子地从被引用对象中存储的值中减去参数,并获取先前持有的值 (公共成员函数) | |
| 原子地对引用值进行加法或减法 (公共成员函数) | |
仅当
| |
| (C++26) |
原子地在参数和被引用对象的值之间执行 std::max,并获取先前持有的值 (公共成员函数) |
| (C++26) |
原子地在参数和被引用对象的值之间执行 std::min,并获取先前持有的值 (公共成员函数) |
| 原子地将引用对象递增或递减一 (公共成员函数) | |
仅当
| |
| 原子地在参数和被引用对象的值之间执行按位与,并获取先前持有的值 (公共成员函数) | |
| 原子地在参数和被引用对象的值之间执行按位或,并获取先前持有的值 (公共成员函数) | |
| 原子地在参数和被引用对象的值之间执行按位异或,并获取先前持有的值 (公共成员函数) | |
| 原子地对引用值执行按位与、或、异或 (公共成员函数) | |
[编辑] 特化
标准规定 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++ 标准。
| 缺陷报告 | 应用于 | 发布时的行为 | 正确的行为 |
|---|---|---|---|
| LWG 3508 (P3323R1) |
C++20 | atomic_ref<T> 具有无法实现的操作 如果 T 是 const 类型或非对象指针类型 |
这些操作要么受到约束 要么不为不合适的 T 提供 |
[编辑] 另请参阅
| (C++11) |
atomic 类模板和针对 bool、整型、浮点型(C++20 起) 和指针类型的特化 (类模板) |