C++ 参考手册
- C++11
- C++14
- C++17
- C++20
- C++ 编译器支持情况表
- 独立与宿主实现
- C++ 语言
- C++ 关键词
- 预处理器
- C++ 标准库头文件
- 具名要求
- 功能特性测试 (C++20)
- 工具库
- 类型支持(基本类型、RTTI、类型特性)
- 概念库 (C++20)
- 错误处理
- 动态内存管理
- 日期和时间工具
- 字符串库
- 容器库
- 迭代器库
- 范围库 (C++20)
- 算法库
- 数值库
- 输入/输出库
- 文件系统库
- 本地化库
- 正则表达式库
- 原子操作库
- std::atomic
- std::atomic_flag
- std::atomic_ref
- std::atomic_ref<T>::atomic_ref
- std::atomic_ref<T>::operator=
- std::atomic_ref<T>::is_lock_free
- std::atomic_ref<T>::store
- std::atomic_ref<T>::load
- std::atomic_ref<T>::operator T
- std::atomic_ref<T>::exchange
- std::atomic_ref<T>::compare_exchange_weak, std::atomic_ref<T>::compare_exchange_strong
- std::atomic_ref<T>::wait
- std::atomic_ref<T>::notify_one
- std::atomic_ref<T>::notify_all
- std::atomic_ref<T>::is_always_lock_free
- std::atomic_ref<T>::required_alignment
- std::atomic_ref<T>::fetch_add
- std::atomic_ref<T>::fetch_sub
- std::atomic_ref<T>::fetch_and
- std::atomic_ref<T>::fetch_or
- std::atomic_ref<T>::fetch_xor
- std::atomic_ref<T>::operator++,++(int),--,--(int)
- std::atomic_ref<T>::operator+=,-=,&=,|=,^=
- std::atomic_store, std::atomic_store_explicit
- std::atomic_load, std::atomic_load_explicit
- std::atomic_exchange, std::atomic_exchange_explicit
- std::atomic_compare_exchange_weak, std::atomic_compare_exchange_strong, std::atomic_compare_exchange_weak_explicit, std::atomic_compare_exchange_strong_explicit
- std::atomic_fetch_add, std::atomic_fetch_add_explicit
- std::atomic_fetch_sub, std::atomic_fetch_sub_explicit
- std::atomic_fetch_and, std::atomic_fetch_and_explicit
- std::atomic_fetch_or, std::atomic_fetch_or_explicit
- std::atomic_fetch_xor, std::atomic_fetch_xor_explicit
- std::atomic_is_lock_free, ATOMIC_xxx_LOCK_FREE
- std::atomic_wait, std::atomic_wait_explicit
- std::atomic_notify_one
- std::atomic_notify_all
- std::atomic_flag_test_and_set, std::atomic_flag_test_and_set_explicit
- std::atomic_flag_clear, std::atomic_flag_clear_explicit
- std::atomic_flag_test, std::atomic_flag_test_explicit
- std::atomic_flag_wait, std::atomic_flag_wait_explicit
- std::atomic_flag_notify_one
- std::atomic_flag_notify_all
- std::atomic_init
- ATOMIC_VAR_INIT
- ATOMIC_FLAG_INIT
- std::memory_order
- std::kill_dependency
- std::atomic_thread_fence
- std::atomic_signal_fence
- 注释
- 线程支持库
- 实验性 C++ 特性
- 有用的资源
- 索引
- std 符号索引
- 协程支持 (C++20)
- C++ 关键词
std::atomic_ref
定义于头文件 <atomic>
|
||
template< class T > struct atomic_ref; |
(1) | (C++20 起) |
template< class T > struct atomic_ref<T*>; |
(2) | (C++20 起) |
std::atomic_ref
类模板应用原子操作到其所引用的对象。在 atomic_ref
对象的生存期中,认为其所引用的对象是原子对象。若一个线程写入原子对象,同时另一线程从它读取,则行为良好定义(数据竞争上的细节见内存模型)。另外,对原子对象的访问可以建立线程间同步,和按 std::memory_order 所指定排序非原子内存访问。
对象的生存期必须超出所有引用该对象的 atomic_ref
的生存期。任何 atomic_ref
实例引用存在的对象时,必须只通过这些 atomic_ref
实例排他地访问该对象。 atomic_ref
对象所引用对象的任何子对象均不可同时为任何其他 atomic_ref
对象所引用。
通过 atomic_ref
应用到对象的原子操作,相对于通过任何其他引用同一对象的 atomic_ref
应用的操作是原子的。
std::atomic_ref
为可复制构造 (CopyConstructible) 。
类似语言引用,常性对 atomic_ref
为浅——可通过 const
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_add
、 fetch_sub
。
整数类型的特化
以下列整数类型之一实例化时, std::atomic_ref
提供适合整数类型的原子操作,如 fetch_add
、 fetch_sub
、 fetch_and
、 fetch_or
、 fetch_xor
:
- 字符类型 char 、 char8_t 、 char16_t 、 char32_t 及 wchar_t ;
- 标准有符号整数类型: signed char 、 short 、 int 、 long 及 long long ;
- 标准无符号整数类型: unsigned char 、 unsigned short 、 unsigned int 、 unsigned long 及 unsigned long long ;
- 任何头文件 <cstdint> 中的 typedef 所需的额外整数类型。
定义有符号整数算术为使用补码;无未定义结果。
浮点类型的特化
以浮点类型 float 、 double 和 long double 之一实例化时, std::atomic_ref
提供适合浮点类型的额外原子操作,如 fetch_add
和 fetch_sub
。
没有操作导致未定义行为,即使结果不可以浮点类型表示。有影响的浮点环境可能异于调用方线程的浮点环境。
成员类型
成员类型 | 定义 |
value_type
|
见下方 |
difference_type
|
value_type (仅对于 atomic_ref<Integral> 及 atomic_ref<Floating> 特化)std::ptrdiff_t (仅对于 atomic_ref<T*> 特化)
|
对于每个 std::atomic_ref<X>
(无论是否特化), std::atomic_ref<X>::value_type
均为 X
。
初等 atomic_ref
模板中不定义 difference_type
。
成员函数
构造 atomic_ref 对象 (公开成员函数) | |
存储值到 atomic_ref 对象所引用的对象中 (公开成员函数) | |
检查该 atomic_ref 对象是否免锁 (公开成员函数) | |
原子地以非原子参数替换被引用对象的值 (公开成员函数) | |
原子地获得被引用对象的值 (公开成员函数) | |
从被引用对象加载值 (公开成员函数) | |
原子地替换被引用对象的值并获得先前保有的值 (公开成员函数) | |
原子地与非原子参数比较被引用值,而若相等则进行原子交换,否则进行原子加载 (公开成员函数) | |
(C++20) |
阻塞线程直至被提醒且原子值更改 (公开成员函数) |
(C++20) |
提醒至少一个在原子对象上的等待中阻塞的线程 (公开成员函数) |
(C++20) |
提醒所有在原子对象上的等待中阻塞的线程 (公开成员函数) |
常量 | |
指示该类型为始终免锁 (公开静态成员常量) | |
指示被 atomic_ref 引用所要求的对齐 (公开静态成员常量) |
特化的成员函数
原子地将参数加到存储于被引用对象的值,并获得先前保有的值 (公开成员函数) | |
原子地从存储于被引用对象的值减去参数,并获得先前保有的值 (公开成员函数) | |
原子地在参数和被引用对象的值间进行逐位与,并获得先前保有的值 (公开成员函数) | |
原子地在参数和被引用对象的值间进行逐位或,并获得先前保有的值 (公开成员函数) | |
原子地在参数和被引用对象的值间进行逐位异或,并获得先前保有的值 (公开成员函数) | |
原子地将被引用对象增加或减少一 (公开成员函数) | |
原子地和被引用值加、减或者进行逐位与、或、异或 (公开成员函数) |
参阅
(C++11) |
atomic 类模板及其针对布尔、整型和指针类型的特化 (类模板) |