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 起) 和指针类型的特化 (类模板) |