Namespaces
Variants

std:: atomic_ref

From cppreference.net
Concurrency support library
Threads
(C++11)
(C++20)
this_thread namespace
(C++11)
(C++11)
Cooperative cancellation
Mutual exclusion
Generic lock management
Condition variables
(C++11)
Semaphores
Latches and Barriers
(C++20)
(C++20)
Futures
(C++11)
(C++11)
(C++11)
Safe reclamation
Hazard pointers
Atomic types
(C++11)
atomic_ref
(C++20)
Initialization of atomic types
(C++11) (deprecated in C++20)
(C++11) (deprecated in C++20)
Memory ordering
(C++11) (deprecated in C++26)
Free functions for atomic operations
Free functions for atomic flags
定义于头文件 <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 的常量性是浅层的——通过 const std::atomic_ref 对象修改被引用值是可行的。

若满足以下任一条件,则程序非良构:

std::atomic_ref 满足 可复制构造 要求。

目录

嵌套类型

类型 定义
value_type std:: remove_cv_t < T >
difference_type
  • T 是除 cv bool 外的算术类型,则为 value_type
  • 否则,若 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 会将它们全部合并到主模板中。

T cv void 或函数类型时, std :: atomic_ref < T * > (即 std :: atomic_ref < void * > std :: atomic_ref < int ( * ) ( ) > 等)不具有 difference_type 或任何需要指针算术 或关系比较 (since C++26) 的操作。

功能测试 标准 功能
__cpp_lib_atomic_ref 201806L (C++20) std::atomic_ref
__cpp_lib_constexpr_atomic 202411L (C++26) constexpr std::atomic and std::atomic_ref

缺陷报告

下列行为变更缺陷报告被追溯应用于先前发布的 C++ 标准。

缺陷报告 适用范围 发布时的行为 正确行为
LWG 3508
( P3323R1 )
C++20 atomic_ref < T > 存在不可实现的操作
T const 类型或指向非对象类型的指针时
针对不合适的 T
这些操作要么被约束要么不提供

参见

(C++11)
原子类模板及针对布尔、整型、 浮点型 (C++20 起) 和指针类型的特化
(类模板)