命名空间
变体
操作

std::atomic_ref

来自 cppreference.cn
< 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 中已弃用)
内存排序
(C++11)(C++26 中已弃用)
原子操作的自由函数
原子标志的自由函数
 
 
定义于头文件 <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::atomic_ref可复制构造的(CopyConstructible)

目录

[编辑] 嵌套类型

类型 定义
value_type std::remove_cv_t<T>
difference_type
  • value_type,如果 T 是除 cv bool 之外的算术类型。
  • 否则,如果 T 是对象指针类型,则为 std::ptrdiff_t
  • 否则,未定义。

[编辑] 数据成员

成员 描述
T* ptr 指向被引用对象的指针
(仅用于阐释的成员对象*)
指示该类型始终是无锁的
(公共静态成员常量) [编辑]
指示 atomic_ref 引用的对象所需的对齐方式
(公共静态成员常量) [编辑]

[编辑] 成员函数

构造一个 atomic_ref 对象
(公共成员函数) [编辑]
将一个值存储到 atomic_ref 对象引用的对象中
(公共成员函数) [编辑]
检查 atomic_ref 对象是否是无锁的
(公共成员函数) [编辑]
原子地用非原子参数替换被引用对象的值
(公共成员函数) [编辑]
原子地获取被引用对象的值
(公共成员函数) [编辑]
从被引用对象加载值
(公共成员函数) [编辑]
原子地替换被引用对象的值并获取先前持有的值
(公共成员函数) [编辑]
原子地将被引用对象的值与非原子参数进行比较,如果相等则执行原子交换,否则执行原子加载
(公共成员函数) [编辑]
阻塞线程直到被通知且原子值改变
(公共成员函数) [编辑]
通知至少一个等待原子对象的线程
(公共成员函数) [编辑]
通知所有被原子对象阻塞的线程
(公共成员函数) [编辑]
(C++26)
返回对象的地址
(公共成员函数) [编辑]
仅当 T 是除 cv bool 之外的算术类型或对象指针类型时提供
原子地将参数添加到被引用对象中存储的值,并获取先前持有的值
(公共成员函数) [编辑]
原子地从被引用对象中存储的值中减去参数,并获取先前持有的值
(公共成员函数) [编辑]
原子地对引用值进行加法或减法
(公共成员函数) [编辑]
仅当 T 是除 cv bool 之外的整数类型或对象指针类型时提供
(C++26)
原子地在参数和被引用对象的值之间执行 std::max,并获取先前持有的值
(公共成员函数) [编辑]
(C++26)
原子地在参数和被引用对象的值之间执行 std::min,并获取先前持有的值
(公共成员函数) [编辑]
原子地将引用对象递增或递减一
(公共成员函数) [编辑]
仅当 T 是除 cv bool 之外的整数类型时提供
原子地在参数和被引用对象的值之间执行按位与,并获取先前持有的值
(公共成员函数) [编辑]
原子地在参数和被引用对象的值之间执行按位或,并获取先前持有的值
(公共成员函数) [编辑]
原子地在参数和被引用对象的值之间执行按位异或,并获取先前持有的值
(公共成员函数) [编辑]
原子地对引用值执行按位与、或、异或
(公共成员函数) [编辑]

[编辑] 特化

标准规定 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 /* 见下文 */

struct atomic_ref</*pointer-type*/>;
(3) (C++20 起)
1) /*integral-type*/ 表示一个可能是 cv 限定的整数类型,但不是 cv bool
2) /*floating-point-type*/ 表示一个可能是 cv 限定的浮点类型。
3) 部分特化适用于可能是 cv 限定的对象指针类型 /*pointer-type*/

[编辑] 注意

实现可能会合并指定的特化。例如,MSVC STL 将所有特化合并到主模板中。

Tcv 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::atomicstd::atomic_ref

[编辑] 缺陷报告

下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。

缺陷报告 应用于 发布时的行为 正确的行为
LWG 3508
(P3323R1)
C++20 atomic_ref<T> 具有无法实现的操作
如果 Tconst 类型或非对象指针类型
这些操作要么受到约束
要么不为不合适的 T 提供

[编辑] 另请参阅

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