<atomic>

定义用于创建支持原子操作的类型的类和类模板。

语法

#include <atomic>

备注

注意

在使用 /clr:pure 编译的代码中,禁止使用此标头。 Visual Studio 2017 及更高版本中已弃用 /clr:pure/clr:safe

一个原子操作有两个关键属性,帮助你使用多个线程正确操控对象,而无需使用 mutex 锁。

  • 由于原子操作是不可见的,因此,仅在第一个原子操作前后,来自不同线程同一对象上的第二个原子操作可以获取该对象的状态。

  • 基于其 memory_order 参数,原子操作可以针对同一个线程中其他原子操作的影响可见性建立排序要求。 因此,它会抑制违反排序要求的编译器优化。

在某些平台上,如果不使用 mutex 锁,可能无法有效地实施某些类型的原子操作。 如果对该类型执行的原子操作都没有使用锁,则原子类型为lock-free

C++11:在信号处理程序中,如果 obj.is_lock_free()atomic_is_lock_free(x)true,则可以对对象 obj 执行原子操作。

atomic_flag 提供一个保留 bool 标志的最小原子类型。 其操作始终为无锁操作。

类模板 atomic<T> 存储其参数类型 T 的对象,并提供对该存储值的原子访问权限。 你可以使用可通过 memcpy 复制的任何类型对该类进行实例化,并通过使用 memcmp 测试是否相等。 特别是,你可以将其与满足这些要求的用户定义类型结合使用,在很多情况下是与浮点类型结合使用。

另外,该模板还具有一套用于整型类型的专用化和用于指针的部分专用化。 这些专用化提供了通过主模板无法执行的其他操作。

指针专用化

atomic<T *> 部分专用化应用于所有指针类型。 它们提供用于指针算术的方法。

整型专用化

atomic<integral> 专用化将应用于所有整型类型。 它们提供了通过主模板无法执行的其他操作。

每个 atomic<integral> 类型都有一个对应的宏,你可以在 if directive 中使用该宏来确定编译时对该类型执行的操作是否为无锁。 如果宏的值为零,则对类型执行的操作不是无锁。 如果值为 1,则操作可能为无锁,且需要进行运行时检查。 如果值为 2,操作为无锁。 可以使用函数 atomic_is_lock_free 确定在运行时对类型执行的操作是否为无锁。

对于每个整型类型,都有相应的已命名原子类型用于管理该整型类型的对象。 每个 atomic_integral 类型都具有与 atomic<T> 的相应实例化相同的成员函数集,并且可以传递至任何非成员原子函数。

atomic_integral 类型 整型类型 atomic_is_lock_free
atomic_char char ATOMIC_CHAR_LOCK_FREE
atomic_schar signed char ATOMIC_CHAR_LOCK_FREE
atomic_uchar unsigned char ATOMIC_CHAR_LOCK_FREE
atomic_char16_t char16_t ATOMIC_CHAR16_T_LOCK_FREE
atomic_char32_t char32_t ATOMIC_CHAR32_T_LOCK_FREE
atomic_wchar_t wchar_t ATOMIC_WCHAR_T_LOCK_FREE
atomic_short short ATOMIC_SHORT_LOCK_FREE
atomic_ushort unsigned short ATOMIC_SHORT_LOCK_FREE
atomic_int int ATOMIC_INT_LOCK_FREE
atomic_uint unsigned int ATOMIC_INT_LOCK_FREE
atomic_long long ATOMIC_LONG_LOCK_FREE
atomic_ulong unsigned long ATOMIC_LONG_LOCK_FREE
atomic_llong long long ATOMIC_LLONG_LOCK_FREE
atomic_ullong unsigned long long ATOMIC_LLONG_LOCK_FREE

对于标头 <inttypes.h> 中定义的某些类型,原子模版的专用化存在 Typedef 名称。

原子类型 Typedef 名称
atomic_int8_t atomic<int8_t>
atomic_uint8_t atomic<uint8_t>
atomic_int16_t atomic<int16_t>
atomic_uint16_t atomic<uint16_t>
atomic_int32_t atomic<int32_t>
atomic_uint32_t atomic<uint32_t>
atomic_int64_t atomic<int64_t>
atomic_uint64_t atomic<uint64_t>
atomic_int_least8_t atomic<int_least8_t>
atomic_uint_least8_t atomic<uint_least8_t>
atomic_int_least16_t atomic<int_least16_t>
atomic_uint_least16_t atomic<uint_least16_t>
atomic_int_least32_t atomic<int_least32_t>
atomic_uint_least32_t atomic<uint_least32_t>
atomic_int_least64_t atomic<int_least64_t>
atomic_uint_least64_t atomic<uint_least64_t>
atomic_int_fast8_t atomic<int_fast8_t>
atomic_uint_fast8_t atomic<uint_fast8_t>
atomic_int_fast16_t atomic<int_fast16_t>
atomic_uint_fast16_ atomic<uint_fast16_t>
atomic_int_fast32_t atomic<int_fast32_t>
atomic_uint_fast32_t atomic<uint_fast32_t>
atomic_int_fast64_t atomic<int_fast64_t>
atomic_uint_fast64_t atomic<uint_fast64_t>
atomic_intptr_t atomic<intptr_t>
atomic_uintptr_t atomic<uintptr_t>
atomic_size_t atomic<size_t>
atomic_ptrdiff_t atomic<ptrdiff_t>
atomic_intmax_t atomic<intmax_t>
atomic_uintmax_t atomic<uintmax_t>

结构

名称 描述
atomic 结构 描述对存储值执行 atomic 操作的对象。
atomic_flag 结构 描述以原子方式设置并清除 bool 标志的对象。

枚举

名称 描述
memory_order 枚举 为内存位置上的同步操作提供符号名称。 这些操作将影响一个线程内的分配如何在另一个线程内变得可见。

函数

在下面的列表中,不是以 _explicit 结尾的函数具有对应的 _explicit 的语义,只不过它们具有 memory_order_seq_cst 的隐式 memory_order 参数。

名称 描述
atomic_compare_exchange_strong 执行 atomic compare and exchange 操作。
atomic_compare_exchange_strong_explicit 执行 atomic compare and exchange 操作。
atomic_compare_exchange_weak 执行 weak atomic compare and exchange 操作。
atomic_compare_exchange_weak_explicit 执行 weak atomic compare and exchange 操作。
atomic_exchange 替换存储值。
atomic_exchange_explicit 替换存储值。
atomic_fetch_add 将指定的值添加到现有存储值。
atomic_fetch_add_explicit 将指定的值添加到现有存储值。
atomic_fetch_and 对指定值和现有存储值执行按位“与”(&)。
atomic_fetch_and_explicit 对指定值和现有存储值执行按位“与”(&)。
atomic_fetch_or 对指定值和现有存储值执行按位“或”(|)。
atomic_fetch_or_explicit 对指定值和现有存储值执行按位“或”(|)。
atomic_fetch_sub 从现有存储值减去指定的值。
atomic_fetch_sub_explicit 从现有存储值减去指定的值。
atomic_fetch_xor 对指定值和现有存储值执行按位“异或”(^)。
atomic_fetch_xor_explicit 对指定值和现有存储值执行按位“异或”(^)。
atomic_flag_clear atomic_flag 对象中的标志设置为 false
atomic_flag_clear_explicit atomic_flag 对象中的标志设置为 false
atomic_flag_test_and_set atomic_flag 对象中的标志设置为 true
atomic_flag_test_and_set_explicit atomic_flag 对象中的标志设置为 true
atomic_init 设置 atomic 对象中存储的值。
atomic_is_lock_free 指定对指定对象执行的原子操作是否为无锁。
atomic_load 以原子方式检索一个值。
atomic_load_explicit 以原子方式检索一个值。
atomic_signal_fence 充当 fence,用于在调用线程中信号处理程序在同一线程中执行的 fence 之间建立内存排序要求。
atomic_store 以原子方式存储一个值。
atomic_store_explicit 以原子方式存储一个值。
atomic_thread_fence 充当就其他 fence 建立内存排序要求的 fence
kill_dependency 中断可能的依赖关系链。

另请参阅

头文件引用
C++ 标准库参考