std::atomic_ref

来自cppreference.com
< cpp‎ | atomic
 
 
并发支持库
线程
(C++11)
(C++20)
(C++20)
this_thread 命名空间
(C++11)
(C++11)
(C++11)
原子类型
(C++11)
atomic_ref
(C++20)
原子类型的初始化
(C++11)(C++20 中弃用)
(C++11)(C++20 中弃用)
原子操作的自由函数
原子标志的自由函数
内存序
互斥
(C++11)
通用锁管理
(C++11)
(C++11)
(C++11)
(C++11)(C++11)(C++11)
(C++11)
(C++11)
条件变量
(C++11)
信号量
闩与屏障
(C++20)
(C++20)
future
(C++11)
(C++11)
(C++11)
(C++11)
 
 
在标头 <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; // 用户定义的可平凡复制类型
std::atomic_ref<Counters> cnt(counter);    // 对用户定义类型的特化

指针类型的部分特化

标准库提供 std::atomic_ref 模板对所有指针类型的部分特化。在对所有原子类型提供的操作外,这些特化额外支持适合指针类型的原子操作,如 fetch_addfetch_sub

整数类型的特化

以下列整数类型之一实例化时, 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> 中的 typedef 所需的额外整数类型。

定义有符号整数算术为使用补码;无未定义结果。

浮点类型的特化

以无 cv 限定的浮点类型(floatdoublelong double 和无 cv 限定的扩展浮点类型 (C++23 起))实例化时,std::atomic_ref 提供适合浮点类型的额外原子操作,如 fetch_addfetch_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 对象是否免锁
(公开成员函数)
原子地以非原子参数替换被引用对象的值
(公开成员函数)
原子地获得被引用对象的值
(公开成员函数)
从被引用对象加载值
(公开成员函数)
原子地替换被引用对象的值并获得先前保有的值
(公开成员函数)
原子地与非原子参数比较被引用值,而若相等则进行原子交换,否则进行原子加载
(公开成员函数)
(C++20)
阻塞线程直至被提醒且原子值更改
(公开成员函数)
提醒至少一个在原子对象上的等待中阻塞的线程
(公开成员函数)
提醒所有在原子对象上的等待中阻塞的线程
(公开成员函数)

常量

指示该类型为始终免锁
(公开静态成员常量)
指示被 atomic_ref 引用所要求的对齐
(公开静态成员常量)

特化的成员函数

原子地将参数加到存储于被引用对象的值,并获得先前保有的值
(公开成员函数)
原子地从存储于被引用对象的值减去参数,并获得先前保有的值
(公开成员函数)
原子地在参数和被引用对象的值间进行逐位与,并获得先前保有的值
(公开成员函数)
原子地在参数和被引用对象的值间进行逐位或,并获得先前保有的值
(公开成员函数)
原子地在参数和被引用对象的值间进行逐位异或,并获得先前保有的值
(公开成员函数)
原子地将被引用对象增加或减少一
(公开成员函数)
原子地和被引用值加、减或者进行逐位与、或、异或
(公开成员函数)

参阅

(C++11)
atomic 类模板及其针对布尔、整型和指针类型的特化
(类模板)