命名空间
变体
操作

std::atomic_ref

来自 cppreference.com
< cpp‎ | atomic
 
 
并发支持库
线程
(C++11)
(C++20)
this_thread 命名空间
(C++11)
(C++11)
(C++11)
协作取消
互斥
(C++11)
通用锁管理
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
条件变量
(C++11)
信号量
闩锁和屏障
(C++20)
(C++20)
期货
(C++11)
(C++11)
(C++11)
(C++11)
安全回收
(C++26)
危险指针
原子类型
(C++11)
atomic_ref
(C++20)
原子类型初始化
(C++11)(C++20 中已弃用)
(C++11)(C++20 中已弃用)
内存排序
原子操作的自由函数
原子标志的自由函数
 
 
在头文件 <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_refCopyConstructible

与语言引用类似,std::atomic_ref 的常量性是浅层的 - 可以通过 const std::atomic_ref 对象修改引用的值。

内容

[edit] 专门化

[edit] 主模板

std::atomic_ref 模板可以使用任何 TriviallyCopyable 类型 T (包括 bool)进行实例化。

struct Counters { int a; int b; }; // user-defined trivially-copyable type
alignas(std::atomic_ref<Counters>::required_alignment) Counters counter;
std::atomic_ref<Counters> cnt(counter); // specialization for the user-defined type

[edit] 指针类型的部分专门化

标准库为所有指针类型提供了 std::atomic_ref 模板的部分专门化。除了为所有原子类型提供的操作之外,这些专门化还额外支持指针类型合适的原子算术运算,例如 fetch_addfetch_sub

[edit] 整数类型的专门化

当使用以下整数类型之一进行实例化时,std::atomic_ref 将提供适合整数类型的额外原子操作,例如 fetch_addfetch_subfetch_andfetch_orfetch_xor

  • 字符类型 charchar8_tchar16_tchar32_twchar_t
  • 标准有符号整数类型:signed charshortintlonglong long
  • 标准的无符号整数类型:unsigned charunsigned shortunsigned intunsigned longunsigned long long
  • 头文件 <cstdint> 中的类型定义所需的任何其他整数类型。

有符号整数运算定义为使用二进制补码;没有未定义的结果。

[编辑] 浮点类型特化

当使用其中一个 cv 无限定的浮点类型(floatdoublelong double 和 cv 无限定的 扩展浮点类型(自 C++23 起))实例化时,std::atomic_ref 提供适用于浮点类型的其他原子操作,例如 fetch_addfetch_sub

即使结果在浮点类型中不可表示,也不会导致未定义的行为。生效的 浮点环境 可能与调用线程的浮点环境不同。

[编辑] 成员类型

成员类型 定义
value_type 见下文
difference_type value_type (仅针对 atomic_ref<Integral>atomic_ref<Floating> 特化)
std::ptrdiff_t (仅针对 std::atomic_ref<T*> 特化)

对于每个 std::atomic_ref<X>(无论是特化还是未特化),std::atomic_ref<X>::value_type 都是 X

difference_type 在主要的 atomic_ref 模板中未定义。

[编辑] 成员函数

构造 atomic_ref 对象
(公共成员函数) [编辑]
将值存储到 atomic_ref 对象引用的对象中
(公共成员函数) [编辑]
检查 atomic_ref 对象是否无锁
(公共成员函数) [编辑]
以原子方式将引用对象的 value 替换为非原子参数
(公共成员函数) [编辑]
以原子方式获取引用对象的 value
(公共成员函数) [编辑]
从引用对象加载 value
(公共成员函数) [编辑]
以原子方式替换引用对象的 value 并获取先前持有的 value
(公共成员函数) [编辑]
以原子方式将引用对象的 value 与非原子参数进行比较,如果相等则执行原子交换,否则执行原子加载
(公共成员函数) [编辑]
阻塞线程,直到收到通知并且原子值更改
(公共成员函数) [编辑]
通知至少一个在原子对象上等待的线程
(公共成员函数) [编辑]
通知所有阻塞在原子对象上等待的线程
(公共成员函数) [编辑]

常量

指示该类型始终无锁
(公共静态成员常量) [编辑]
指示由 atomic_ref 引用的对象的必需对齐方式
(公共静态成员常量) [编辑]

[编辑] 特化成员函数

针对整数、浮点和指针类型特化
以原子方式将参数添加到存储在引用对象中的 value 中,并获取先前持有的 value
(公共成员函数) [编辑]
以原子方式从存储在引用对象中的 value 中减去参数,并获取先前持有的 value
(公共成员函数) [编辑]
以原子方式添加到或从引用值中减去
(公共成员函数) [编辑]
仅针对整数和指针类型特化
(C++26)
以原子方式在参数和引用对象的 value 之间执行 std::max,并获取先前持有的 value
(公共成员函数) [编辑]
(C++26)
以原子方式在参数和引用对象的 value 之间执行 std::min,并获取先前持有的 value
(公共成员函数) [编辑]
以原子方式将引用对象递增或递减 1
(公共成员函数) [编辑]
专门化用于仅整数类型
以原子方式对参数和引用对象的 value 执行按位 AND,并获取先前持有的 value
(公共成员函数) [编辑]
以原子方式对参数和引用对象的 value 执行按位 OR,并获取先前持有的 value
(公共成员函数) [编辑]
以原子方式对参数和引用对象的 value 执行按位 XOR,并获取先前持有的 value
(公共成员函数) [编辑]
以原子方式对引用值执行按位 AND、OR、XOR
(公共成员函数) [编辑]

[编辑] 注释

功能测试 Std 功能
__cpp_lib_atomic_ref 201806L (C++20) std::atomic_ref

[编辑] 另请参阅

(C++11)
原子类模板和针对 bool、整数、 浮点、(自 C++20 起) 和指针类型的特化
(类模板) [编辑]