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 弃用)
内存定序
(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 应用的操作来说都是原子的。

类似核心语言中的引用,const 性对于 std::atomic_ref 是表层的——可通过 const std::atomic_ref 对象修改被引用的值。

如果满足以下任意以下条件,那么程序非良构:

std::atomic_ref 可复制构造 (CopyConstructible)

目录

[编辑] 嵌套类型

类型 定义
value_type std::remove_cv_t<T>
difference_type
  • Tcv bool 以外的算术类型时是 value_type
  • 否则在 T 是指向对象的指针类型时是 std::ptrdiff_t
  • 否则不定义。

[编辑] 数据成员

成员 描述
T* ptr 指向被引用对象的指针
(仅用于阐述的成员对象*)
指示该类型为始终免锁
(公开静态成员常量) [编辑]
指示被 atomic_ref 引用的对象所要求的对齐
(公开静态成员常量) [编辑]

[编辑] 成员函数

构造 atomic_ref 对象
(公开成员函数) [编辑]
存储值到 atomic_ref 对象所引用的对象中
(公开成员函数) [编辑]
检查该 atomic_ref 对象是否免锁
(公开成员函数) [编辑]
原子地以非原子实参替换被引用对象的值
(公开成员函数) [编辑]
原子地获得被引用对象的值
(公开成员函数) [编辑]
从被引用对象加载值
(公开成员函数) [编辑]
原子地替换被引用对象的值并获得先前保有的值
(公开成员函数) [编辑]
原子地比较被引用对象的值与非原子实参,而若相等则进行原子交换,否则进行原子加载
(公开成员函数) [编辑]
阻塞线程直到被提醒且原子值更改
(公开成员函数) [编辑]
提醒至少一个在原子对象上的等待中阻塞的线程
(公开成员函数) [编辑]
提醒所有在原子对象上的等待中阻塞的线程
(公开成员函数) [编辑]
(C++26)
返回对象的地址
(公开成员函数) [编辑]
仅当 Tcv bool 以外的算术类型或指向对象的指针类型时提供
原子地将实参加到存储于被引用对象的值上,并获得先前保有的值
(公开成员函数) [编辑]
原子地从存储于被引用对象的值中减去实参,并获得先前保有的值
(公开成员函数) [编辑]
原子地和被引用值加、减
(公开成员函数) [编辑]
仅当 Tcv bool 以外的整数类型或指向对象的指针类型时提供
(C++26)
原子地进行实参和被引用对象的值的 std::max,并获得先前保有的值
(公开成员函数) [编辑]
(C++26)
原子地进行实参和被引用对象的值的 std::min,并获得先前保有的值
(公开成员函数) [编辑]
原子地将被引用对象增加或减少一
(公开成员函数) [编辑]
仅当 Tcv bool 以外的整数类型时提供
原子地在实参和被引用对象的值间进行逐位与,并获得先前保有的值
(公开成员函数) [编辑]
原子地在实参和被引用对象的值间进行逐位或,并获得先前保有的值
(公开成员函数) [编辑]
原子地在实参和被引用对象的值间进行逐位异或,并获得先前保有的值
(公开成员函数) [编辑]
原子地和被引用值进行逐位与、或、异或
(公开成员函数) [编辑]

[编辑] 特化

标准指定 std::atomic_ref 拥有以下特化:

template<>
struct atomic_ref</*整数类型*/>;
(1) (C++20 起)
template<>
struct atomic_ref</*浮点数类型*/>;
(2) (C++20 起)
template< class /*指针类型*/ >

    requires /* 见下文 */

struct atomic_ref</*指针类型*/>;
(3) (C++20 起)
1) /*整数类型*/ 指代 cv bool 以外的可能有 cv 限定的整数类型。
2) /*浮点数类型*/ 指代可能有 cv 限定的浮点数类型。
3) 对可能有 cv 限定的指向对象的指针类型 /*指针类型*/ 提供部分特化。

[编辑] 注解

实现可能合并指定的特化。例如 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) constexprstd::atomicstd::atomic_ref

[编辑] 缺陷报告

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

缺陷报告 应用于 出版时的行为 正确行为
LWG 3508
(P3323R1)
C++20 Tconst 类型或指向非对象的指针类型时
atomic_ref<T> 有不可实现的操作
这些操作受到约束,
或不对不适合的 T 提供

[编辑] 参阅

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