C++ 参考手册
- C++11
- C++14
- C++17
- C++20
- C++ 编译器支持情况表
- 独立与宿主实现
- C++ 语言
- C++ 关键词
- 预处理器
- C++ 标准库头文件
- 具名要求
- 功能特性测试 (C++20)
- 工具库
- 类型支持(基本类型、RTTI、类型特性)
- 概念库 (C++20)
- 错误处理
- 动态内存管理
- 日期和时间工具
- 字符串库
- 容器库
- 迭代器库
- 范围库 (C++20)
- 算法库
- 数值库
- 输入/输出库
- 文件系统库
- 本地化库
- 正则表达式库
- 原子操作库
- std::atomic
- std::atomic<T>::atomic
- std::atomic<T>::operator=
- std::atomic<T>::is_lock_free
- std::atomic<T>::is_always_lock_free
- std::atomic<T>::store
- std::atomic<T>::load
- std::atomic<T>::operator T()
- std::atomic<T>::exchange
- std::atomic<T>::compare_exchange_weak, std::atomic<T>::compare_exchange_strong
- std::atomic<T>::wait
- std::atomic<T>::notify_one
- std::atomic<T>::notify_all
- std::atomic<T>::fetch_add
- std::atomic<T>::fetch_sub
- std::atomic<T>::fetch_and
- std::atomic<T>::fetch_or
- std::atomic<T>::fetch_xor
- std::atomic<T>::operator++,++(int),--,--(int)
- std::atomic<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_flag
- std::atomic_ref
- 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
每个 std::atomic
模板的实例化和全特化定义一个原子类型。若一个线程写入原子对象,同时另一线程从它读取,则行为良好定义(数据竞争的细节见内存模型)。
另外,对原子对象的访问可以建立线程间同步,并按 std::memory_order 所对非原子内存访问定序。
std::atomic
既不可复制亦不可移动。
特化
初等模板
初等 std::atomic
模板可用任何满足可复制构造 (CopyConstructible) 及可复制赋值 (CopyAssignable) 的可平凡复制 (TriviallyCopyable) 类型 T
特化。若下列任何值为 false
则程序为谬构:
- std::is_trivially_copyable<T>::value
- std::is_copy_constructible<T>::value
- std::is_move_constructible<T>::value
- std::is_copy_assignable<T>::value
- std::is_move_assignable<T>::value
std::atomic<bool> 使用初等模板。它保证是标准布局结构体。
部分特化
标准库为下列类型提供 std::atomic
模板的特化,它们拥有初等模板所不拥有的额外属性:
2) 对所有指针类型的部分特化 std::atomic<U*> 。这些特化拥有标准布局、平凡默认构造函数 (C++20 前)和平凡析构函数。除了为所有原子类型提供的操作,这些特化额外支持适合指针类型的原子算术运算,例如 fetch_add
、 fetch_sub
。
3-4) 为 std::shared_ptr 和 std::weak_ptr 提供部分特化 std::atomic<std::shared_ptr<U>> 和 std::atomic<std::weak_ptr<U>> 。 细节见 std::atomic<std::shared_ptr> 和 std::atomic<std::weak_ptr> 。 |
(C++20 起) |
对整数类型的特化
以下列整数类型之一实例化时, std::atomic
提供适合于整数类型的额外原子操作,例如 fetch_add
、 fetch_sub
、 fetch_and
、 fetch_or
、 fetch_xor
:
- 字符类型 char 、 char8_t (C++20 起)、 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 所需的额外整数类型。
另外,结果的 std::atomic<Integral>
特化拥有标准布局、平凡默认构造函数 (C++20 前)和平凡析构函数。定义有符号整数算术为使用补码;无未定义结果。
对浮点类型的特化以浮点类型 float 、 double 和 long double 之一实例化时, 另外,结果的 无操作导致未定义行为,即使结果不能以浮点类型表示。有效的浮点环境可能不同于调用方线程的浮点环境。 |
(C++20 起) |
类型别名
为 bool 和所有上面列出的整数类型提供如下类型别名:
类型别名 | 定义 |
std::atomic_bool | std::atomic<bool> |
std::atomic_char | std::atomic<char> |
std::atomic_schar | std::atomic<signed char> |
std::atomic_uchar | std::atomic<unsigned char> |
std::atomic_short | std::atomic<short> |
std::atomic_ushort | std::atomic<unsigned short> |
std::atomic_int | std::atomic<int> |
std::atomic_uint | std::atomic<unsigned int> |
std::atomic_long | std::atomic<long> |
std::atomic_ulong | std::atomic<unsigned long> |
std::atomic_llong | std::atomic<long long> |
std::atomic_ullong | std::atomic<unsigned long long> |
std::atomic_char8_t (C++20) | std::atomic<char8_t> |
std::atomic_char16_t | std::atomic<char16_t> |
std::atomic_char32_t | std::atomic<char32_t> |
std::atomic_wchar_t | std::atomic<wchar_t> |
std::atomic_int8_t | std::atomic<std::int8_t> |
std::atomic_uint8_t | std::atomic<std::uint8_t> |
std::atomic_int16_t | std::atomic<std::int16_t> |
std::atomic_uint16_t | std::atomic<std::uint16_t> |
std::atomic_int32_t | std::atomic<std::int32_t> |
std::atomic_uint32_t | std::atomic<std::uint32_t> |
std::atomic_int64_t | std::atomic<std::int64_t> |
std::atomic_uint64_t | std::atomic<std::uint64_t> |
std::atomic_int_least8_t | std::atomic<std::int_least8_t> |
std::atomic_uint_least8_t | std::atomic<std::uint_least8_t> |
std::atomic_int_least16_t | std::atomic<std::int_least16_t> |
std::atomic_uint_least16_t | std::atomic<std::uint_least16_t> |
std::atomic_int_least32_t | std::atomic<std::int_least32_t> |
std::atomic_uint_least32_t | std::atomic<std::uint_least32_t> |
std::atomic_int_least64_t | std::atomic<std::int_least64_t> |
std::atomic_uint_least64_t | std::atomic<std::uint_least64_t> |
std::atomic_int_fast8_t | std::atomic<std::int_fast8_t> |
std::atomic_uint_fast8_t | std::atomic<std::uint_fast8_t> |
std::atomic_int_fast16_t | std::atomic<std::int_fast16_t> |
std::atomic_uint_fast16_t | std::atomic<std::uint_fast16_t> |
std::atomic_int_fast32_t | std::atomic<std::int_fast32_t> |
std::atomic_uint_fast32_t | std::atomic<std::uint_fast32_t> |
std::atomic_int_fast64_t | std::atomic<std::int_fast64_t> |
std::atomic_uint_fast64_t | std::atomic<std::uint_fast64_t> |
std::atomic_intptr_t | std::atomic<std::intptr_t> |
std::atomic_uintptr_t | std::atomic<std::uintptr_t> |
std::atomic_size_t | std::atomic<std::size_t> |
std::atomic_ptrdiff_t | std::atomic<std::ptrdiff_t> |
std::atomic_intmax_t | std::atomic<std::intmax_t> |
std::atomic_uintmax_t | std::atomic<std::uintmax_t> |
注意: std::atomic_intN_t
、 std::atomic_uintN_t
、 std::atomic_intptr_t
及 atomic_uintptr_t
分别若且唯若定义了 std::intN_t
、 std::uintN_t
、 std::intptr_t
及 std::uintptr_t
才有定义。
提供额外的特殊用途类型别名:
|
(C++20 起) |
成员类型
成员类型 | 定义 |
value_type
|
T (无论是否特化)
|
difference_type
|
value_type (仅对 atomic<Integral> 和 atomic<Floating> (C++20 起) 特化)std::ptrdiff_t (仅对 atomic<U*> 特化)
|
difference_type
不在初等 atomic
模板中,或不在对 std::shared_ptr 和 std::weak_ptr 的部分特化中定义。
成员函数
构造原子对象 (公开成员函数) | |
存储值于原子对象 (公开成员函数) | |
检查原子对象是否免锁 (公开成员函数) | |
原子地以非原子对象替换原子对象的值 (公开成员函数) | |
原子地获得原子对象的值 (公开成员函数) | |
从原子对象加载值 (公开成员函数) | |
原子地替换原子对象的值并获得它先前持有的值 (公开成员函数) | |
原子地比较原子对象与非原子参数的值,若相等则进行交换,若不相等则进行加载 (公开成员函数) | |
(C++20) |
阻塞线程直至被提醒且原子值更改 (公开成员函数) |
(C++20) |
提醒至少一个在原子对象上的等待中阻塞的线程 (公开成员函数) |
(C++20) |
提醒所有在原子对象上的等待中阻塞的线程 (公开成员函数) |
常量 | |
[静态] (C++17) |
指示该类型是否始终免锁 (公开静态成员常量) |
特化成员函数
原子地将参数加到存储于原子对象的值,并返回先前保有的值 (公开成员函数) | |
原子地从存储于原子对象的值减去参数,并获得先前保有的值 (公开成员函数) | |
原子地进行参数和原子对象的值的逐位与,并获得先前保有的值 (公开成员函数) | |
原子地进行参数和原子对象的值的逐位或,并获得先前保有的值 (公开成员函数) | |
原子地进行参数和原子对象的值的逐位异或,并获得先前保有的值 (公开成员函数) | |
令原子值增加或减少一 (公开成员函数) | |
加、减,或与原子值进行逐位与、或、异或 (公开成员函数) |
注解
存在等价于 std::atomic
所有成员函数的非成员函数模板。这些非成员函数可以额外对非 std::atomic 特化的类型重载,但不能保证原子性。标准库中仅有的这种类型是 std::shared_ptr<U> 。
gcc 和 clang 上,此处描述的某些功能要求通过 -latomic
链接。
缺陷报告
下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。
DR | 应用于 | 出版时的行为 | 正确行为 |
---|---|---|---|
LWG 2441 | C++11 | 添加了(可选)定宽整数类型的特化 | |
P0558R1 | C++11 | 实质上重写了规定以解决数个问题 | |
LWG 3012 | C++11 | std::atomic<T> 对任何可平凡复制但非可复制的 T 容许
|
禁止这种特化 |
参阅
(C++11) |
免锁的布尔原子类型 (类) |
引用
- C++11 standard (ISO/IEC 14882:2011):
- 29.5 Atomic types [atomics.types.generic]