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
应用的操作来说都是原子的。
类似核心语言中的引用,const 性对于 std::atomic_ref
是表层的——可通过 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</*整数类型*/>; |
(1) | (C++20 起) |
template<> struct atomic_ref</*浮点数类型*/>; |
(2) | (C++20 起) |
template< class /*指针类型*/ > 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 | 在 T 是 const 类型或指向非对象的指针类型时atomic_ref<T> 有不可实现的操作 |
这些操作受到约束, 或不对不适合的 T 提供
|
[编辑] 参阅
(C++11) |
atomic 类模板及其针对布尔、整数、浮点数(C++20 起)和指针类型的特化 (类模板) |