std::atomic_ref
| 
 在标头  
<atomic> 定义 | 
||
| 
 template< class T > 
struct atomic_ref;  | 
(1) | (C++20 起) | 
| 
 template< class T > 
struct atomic_ref<T*>;  | 
(2) | (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 可复制构造 (CopyConstructible) 。
类似语言引用,常性对于 std::atomic_ref 是浅层的——可通过 const std::atomic_ref 对象修改被引用的值。
特化
主模板
主 std::atomic_ref 模板可以用任何可平凡复制 (TriviallyCopyable) 类型 T(包括 bool)实例化:
struct Counters { int a; int b; } counter; // 用户定义的可平凡复制类型 alignas(std::atomic_ref<Counters>::required_alignment) Counters counter; std::atomic_ref<Counters> cnt(counter); // 对用户定义类型的特化
指针类型的部分特化
标准库提供 std::atomic_ref 模板对所有指针类型的部分特化。在对所有原子类型提供的操作外,这些特化额外支持适合指针类型的原子操作,如 fetch_add、fetch_sub。
整数类型的特化
以下列整数类型之一实例化时,std::atomic_ref 提供适合整数类型的原子操作,如 fetch_add、fetch_sub、fetch_and、fetch_or、fetch_xor:
- 
- 字符类型 char、char8_t、char16_t、char32_t 及 wchar_t;
 - 标准有符号整数类型:signed char、short、int、long 及 long long;
 - 标准无符号整数类型:unsigned char、unsigned short、unsigned int、unsigned long 及 unsigned long long;
 - 标头 <cstdint> 中的 typedef 所需的任何额外整数类型。
 
 
定义有符号整数算术为使用补码;无未定义结果。
浮点类型的特化
以无 cv 限定的浮点类型(float、double、long double 和无 cv 限定的扩展浮点类型 (C++23 起))实例化时,std::atomic_ref 提供适合浮点类型的额外原子操作,如 fetch_add 和 fetch_sub。
没有操作导致未定义行为,即使结果不可以浮点类型表示。生效的浮点环境可能与调用方线程的浮点环境不同。
成员类型
| 成员类型 | 定义 | 
value_type | 
见下文 | 
difference_type | 
value_type(仅对于 atomic_ref<整数> 及 atomic_ref<浮点> 特化)std::ptrdiff_t (仅对于 std::atomic_ref<T*> 特化) | 
对于每个 std::atomic_ref<X>(无论是否特化),std::atomic_ref<X>::value_type 都是 X。
主 std::atomic_ref 模板中不定义 difference_type。
成员函数
构造 atomic_ref 对象(公开成员函数)  | 
|
存储值到 atomic_ref 对象所引用的对象中(公开成员函数)  | 
|
检查该 atomic_ref 对象是否免锁(公开成员函数)  | 
|
| 原子地以非原子实参替换被引用对象的值 (公开成员函数)  | 
|
| 原子地获得被引用对象的值 (公开成员函数)  | 
|
| 从被引用对象加载值 (公开成员函数)  | 
|
| 原子地替换被引用对象的值并获得先前保有的值 (公开成员函数)  | 
|
| 原子地比较被引用对象的值与非原子实参,而若相等则进行原子交换,否则进行原子加载 (公开成员函数)  | 
|
| 阻塞线程直到被提醒且原子值更改 (公开成员函数)  | 
|
| 提醒至少一个在原子对象上的等待中阻塞的线程 (公开成员函数)  | 
|
| 提醒所有在原子对象上的等待中阻塞的线程 (公开成员函数)  | 
|
常量 | 
|
| 
 [静态] 
 | 
指示该类型为始终免锁 (公开静态成员常量)  | 
| 
 [静态] 
 | 
指示被 atomic_ref 引用的对象所要求的对齐(公开静态成员常量)  | 
特化的成员函数
为整数、浮点和指针类型特化 | 
|
| 原子地将实参加到存储于被引用对象的值上,并获得先前保有的值 (公开成员函数)  | 
|
| 原子地从存储于被引用对象的值中减去实参,并获得先前保有的值 (公开成员函数)  | 
|
| 原子地和被引用值加、减 (公开成员函数)  | 
|
仅为整数和指针类型特化 | 
|
| 
 (C++26) 
 | 
原子地进行实参和被引用对象的值的 std::max,并获得先前保有的值 (公开成员函数)  | 
| 
 (C++26) 
 | 
原子地进行实参和被引用对象的值的 std::min,并获得先前保有的值 (公开成员函数)  | 
| 原子地将被引用对象增加或减少一 (公开成员函数)  | 
|
仅为整数类型特化 | 
|
| 原子地在实参和被引用对象的值间进行逐位与,并获得先前保有的值 (公开成员函数)  | 
|
| 原子地在实参和被引用对象的值间进行逐位或,并获得先前保有的值 (公开成员函数)  | 
|
| 原子地在实参和被引用对象的值间进行逐位异或,并获得先前保有的值 (公开成员函数)  | 
|
| 原子地和被引用值进行逐位与、或、异或 (公开成员函数)  | 
|
注解
| 功能特性测试宏 | 值 | 标准 | 功能特性 | 
|---|---|---|---|
__cpp_lib_atomic_ref | 
201806L | (C++20) | std::atomic_ref | 
参阅
| 
 (C++11) 
 | 
atomic 类模板及其针对布尔、整数、浮点数 (C++20 起)和指针类型的特化 (类模板)  |