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


    定义于头文件 

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

    template< class T >    struct atomic;

    (1)(C++11 起)

    template< class U >   struct atomic;

    (2)(C++11 起)

    template     struct atomicshared_ptr>;

    (3)(C++20 起)

    template     struct atomicweak_ptr>;

    (4)(C++20 起)

    每个 std::atomic 模板的实例化和全特化定义一个原子类型。若一个线程写入原子对象,同时另一线程从它读取,则行为良好定义(数据竞争的细节见内存模型)。

    另外,对原子对象的访问可以建立线程间同步,并按 std::memory_order 所对非原子内存访问定序。

    std::atomic 既不可复制亦不可移动。

    特化

    初等模板

    初等 std::atomic 模板可用任何满足 可复制构造 (CopyConstructible) 及 可复制赋值 (CopyAssignable) 的 可平凡复制 (TriviallyCopyable) 类型 T 特化。若下列任何值为 false 则程序为病式:

    • std::is_trivially_copyable::value
    • std::is_copy_constructible::value
    • std::is_move_constructible::value
    • std::is_copy_assignable::value
    • std::is_move_assignable::value

    std::atomic 使用初等模板。它保证是标准布局结构体。

    部分特化

    标准库为下列类型提供 std::atomic 模板的特化,它们拥有初等模板所不拥有的额外属性:

    2) 对所有指针类型的部分特化 std::atomic 。这些特化拥有标准布局、平凡默认构造函数和平凡析构函数。除了为所有原子类型提供的操作,这些特化额外支持适合指针类型的原子算术运算,例如 fetch_addfetch_sub

    3-4) 为 std::shared_ptr 和 std::weak_ptr 提供部分特化 std::atomic> 和 std::atomic> 。

    细节见 std::atomic 和 std::atomic

    (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 ;
    • 任何头文件 中的 typedef 所需的额外整数类型。

    另外,结果的 std::atomic<Integral> 特化拥有标准布局、平凡默认构造函数和平凡析构函数。定义有符号整数算术为使用补码;无未定义结果。

    对浮点类型的特化

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

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

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

    (C++20 起)

    类型别名

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

    类型别名定义
    std::atomic_boolstd::atomic
    std::atomic_charstd::atomic
    std::atomic_scharstd::atomic
    std::atomic_ucharstd::atomic
    std::atomic_shortstd::atomic
    std::atomic_ushortstd::atomic
    std::atomic_intstd::atomic
    std::atomic_uintstd::atomic
    std::atomic_longstd::atomic
    std::atomic_ulongstd::atomic
    std::atomic_llongstd::atomic
    std::atomic_ullongstd::atomic
    std::atomic_char8_tstd::atomic (C++20)
    std::atomic_char16_tstd::atomic
    std::atomic_char32_tstd::atomic
    std::atomic_wchar_tstd::atomic
    std::atomic_int8_tstd::atomic
    std::atomic_uint8_tstd::atomic
    std::atomic_int16_tstd::atomic
    std::atomic_uint16_tstd::atomic
    std::atomic_int32_tstd::atomic
    std::atomic_uint32_tstd::atomic
    std::atomic_int64_tstd::atomic
    std::atomic_uint64_tstd::atomic
    std::atomic_int_least8_tstd::atomic
    std::atomic_uint_least8_tstd::atomic
    std::atomic_int_least16_tstd::atomic
    std::atomic_uint_least16_tstd::atomic
    std::atomic_int_least32_tstd::atomic
    std::atomic_uint_least32_tstd::atomic
    std::atomic_int_least64_tstd::atomic
    std::atomic_uint_least64_tstd::atomic
    std::atomic_int_fast8_tstd::atomic
    std::atomic_uint_fast8_tstd::atomic
    std::atomic_int_fast16_tstd::atomic
    std::atomic_uint_fast16_tstd::atomic
    std::atomic_int_fast32_tstd::atomic
    std::atomic_uint_fast32_tstd::atomic
    std::atomic_int_fast64_tstd::atomic
    std::atomic_uint_fast64_tstd::atomic
    std::atomic_intptr_tstd::atomic
    std::atomic_uintptr_tstd::atomic
    std::atomic_size_tstd::atomic
    std::atomic_ptrdiff_tstd::atomic
    std::atomic_intmax_tstd::atomic
    std::atomic_uintmax_tstd::atomic

    注意: 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 特化)

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

  • 相关阅读:
    spring常见问题汇总
    软文发稿平台那么多,为什么选择媒介盒子
    Kotlin中的选择结构语句
    Android 各版本及API对照表
    知识图谱(Knowledge Graph)- Neo4j 5.10.0 使用 - CQL - 太极拳传承谱系表
    【CAD建模号】V4.3更新:保存新功能
    一文熟悉Latex论文排版
    Excel的只读模式如何设置和取消?
    一图带你领略Spring Bean的生命周期全过程
    腾讯云服务器如何使用WooCommerce 应用镜像搭建电商独立网站
  • 原文地址:https://blog.csdn.net/qq_40788199/article/details/126879524