c++ 11 原子操作库 (std::atomic)(一)

定义于头文件 <atomic>

atomic 类模板及其针对布尔、整型和指针类型的特化

template< class T >    struct atomic;

(1)(C++11 起)

template< class U >   struct atomic<U*>;

(2)(C++11 起)

template<class U>     struct atomic<std::shared_ptr<U>>;

(3)(C++20 起)

template<class U>     struct atomic<std::weak_ptr<U>>;

(4)(C++20 起)

每个 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*> 。这些特化拥有标准布局、平凡默认构造函数和平凡析构函数。除了为所有原子类型提供的操作,这些特化额外支持适合指针类型的原子算术运算,例如 fetch_addfetch_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_addfetch_subfetch_andfetch_orfetch_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> 特化拥有标准布局、平凡默认构造函数和平凡析构函数。定义有符号整数算术为使用补码;无未定义结果。

对浮点类型的特化

以浮点类型 float 、 double 和 long double 之一实例化时, std::atomic 提供适合于浮点类型的额外原子操作,例如 fetch_addfetch_sub

另外,结果的 std::atomic<Floating> 特化拥有标准布局、平凡默认构造函数和平凡析构函数。

无操作导致未定义行为,即使结果不能以浮点类型表示。有效的浮点环境可能不同于调用方线程的浮点环境。

(C++20 起)

类型别名

为 bool 和所有上面列出的整数类型提供如下类型别名:

类型别名定义
std::atomic_boolstd::atomic<bool>
std::atomic_charstd::atomic<char>
std::atomic_scharstd::atomic<signed char>
std::atomic_ucharstd::atomic<unsigned char>
std::atomic_shortstd::atomic<short>
std::atomic_ushortstd::atomic<unsigned short>
std::atomic_intstd::atomic<int>
std::atomic_uintstd::atomic<unsigned int>
std::atomic_longstd::atomic<long>
std::atomic_ulongstd::atomic<unsigned long>
std::atomic_llongstd::atomic<long long>
std::atomic_ullongstd::atomic<unsigned long long>
std::atomic_char8_tstd::atomic<char8_t> (C++20)
std::atomic_char16_tstd::atomic<char16_t>
std::atomic_char32_tstd::atomic<char32_t>
std::atomic_wchar_tstd::atomic<wchar_t>
std::atomic_int8_tstd::atomic<std::int8_t>
std::atomic_uint8_tstd::atomic<std::uint8_t>
std::atomic_int16_tstd::atomic<std::int16_t>
std::atomic_uint16_tstd::atomic<std::uint16_t>
std::atomic_int32_tstd::atomic<std::int32_t>
std::atomic_uint32_tstd::atomic<std::uint32_t>
std::atomic_int64_tstd::atomic<std::int64_t>
std::atomic_uint64_tstd::atomic<std::uint64_t>
std::atomic_int_least8_tstd::atomic<std::int_least8_t>
std::atomic_uint_least8_tstd::atomic<std::uint_least8_t>
std::atomic_int_least16_tstd::atomic<std::int_least16_t>
std::atomic_uint_least16_tstd::atomic<std::uint_least16_t>
std::atomic_int_least32_tstd::atomic<std::int_least32_t>
std::atomic_uint_least32_tstd::atomic<std::uint_least32_t>
std::atomic_int_least64_tstd::atomic<std::int_least64_t>
std::atomic_uint_least64_tstd::atomic<std::uint_least64_t>
std::atomic_int_fast8_tstd::atomic<std::int_fast8_t>
std::atomic_uint_fast8_tstd::atomic<std::uint_fast8_t>
std::atomic_int_fast16_tstd::atomic<std::int_fast16_t>
std::atomic_uint_fast16_tstd::atomic<std::uint_fast16_t>
std::atomic_int_fast32_tstd::atomic<std::int_fast32_t>
std::atomic_uint_fast32_tstd::atomic<std::uint_fast32_t>
std::atomic_int_fast64_tstd::atomic<std::int_fast64_t>
std::atomic_uint_fast64_tstd::atomic<std::uint_fast64_t>
std::atomic_intptr_tstd::atomic<std::intptr_t>
std::atomic_uintptr_tstd::atomic<std::uintptr_t>
std::atomic_size_tstd::atomic<std::size_t>
std::atomic_ptrdiff_tstd::atomic<std::ptrdiff_t>
std::atomic_intmax_tstd::atomic<std::intmax_t>
std::atomic_uintmax_tstd::atomic<std::uintmax_t>

注意: std::atomic_intN_tstd::atomic_uintN_tstd::atomic_intptr_tatomic_uintptr_t 分别若且唯若定义了 std::intN_tstd::uintN_tstd::intptr_tstd::uintptr_t 才有定义。

提供额外的特殊用途类型别名:

std::atomic_signed_lock_free免锁且对于等待/提醒最高效的有符号整数原子类型
std::atomic_unsigned_lock_free免锁且对于等待/提醒最高效的无符号整数原子类型
(C++20 起)

成员类型

成员类型定义
value_typeT (无论是否特化)
difference_typevalue_type (仅对 atomic<Integral>atomic<Floating> (C++20 起) 特化)
std::ptrdiff_t (仅对 atomic<U*> 特化)

difference_type 不在初等 atomic 模板中,或不在对 std::shared_ptr 和 std::weak_ptr 的部分特化中定义。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值