代码之家  ›  专栏  ›  技术社区  ›  BeeOnRope

原子是否提供原子行为,而不考虑排序?

  •  3
  • BeeOnRope  · 技术社区  · 8 年前

    如果变量是用 std::atomic 模板,例如 std::atomic<int> ,是否保证通过中的方法进行访问 一致的 标准::原子

    据我所知,这相当于问

    1 回复  |  直到 8 年前
        1
  •  5
  •   Peter Cordes    8 年前

    from the Greek atom meaning indivisible std::atomic 类型始终为原子(无撕裂)。

    C++14 draft N4140 29.3顺序和一致性 这是该章的第一部分,详细介绍。第一点是(1.4):

    memory_order_relaxed 在记忆顺序方面是放松的。 关于对该对象的所有其他原子访问 . 结束注释]

    .store() , .load() .fetch_add() )定义语言如下:

    void atomic_store(volatile A * object, C desired) noexcept;
    void atomic_store(A * object, C desired) noexcept;
    void atomic_store_explicit(volatile A * object, C desired, memory_order order) noexcept;
    void atomic_store_explicit(A * object, C desired, memory_order order) noexcept;
    void A ::store(C desired, memory_order order = memory_order_seq_cst) volatile noexcept;
    void A ::store(C desired, memory_order order = memory_order_seq_cst) noexcept;
    
    1. 要求:order参数不得为 memory_order_consume , memory_order_acquire memory_order_acq_rel .
    2. 通过对象或此对象指向,具有所需的值。 内存受顺序值的影响。

    原子地

    而不是为了 add / + sub / - ,等等 | , & ^ ,它们有一个适用于此块的键/运算表:

    C atomic_fetch_key (volatile A * object, M operand) noexcept;
    C atomic_fetch_key (A * object, M operand) noexcept;
    C atomic_fetch_key _explicit(volatile A * object, M operand, memory_order order) noexcept;
    C atomic_fetch_key _explicit(A * object, M operand, memory_order order) noexcept;
    C A ::fetch_key (M operand, memory_order order = memory_order_seq_cst) volatile noexcept;
    C A ::fetch_key (M operand, memory_order order = memory_order_seq_cst) noexcept;
    
    • 28 通过物体或 按对象或按此和给定的操作数。内存受到影响 根据订单的价值。这些操作是原子的
    • 29 返回:原子级的值
    • 30 备注:对于有符号整数类型,算术定义为使用两个 补码表示法。没有未定义的结果。用于地址 否则没有未定义的行为。

    memory\u order\u松弛 ).

    事实上,在加载一个很昂贵的宽类型(例如之前)时,没有办法“关闭”原子性 a CAS on atomic<pointer_and_ABAcounter> which compiles to lock cmpxchg16b

    更重要的是,该联盟是gcc的一个解决方案,而不是优化 ptr_and_counter.ptr 只加载指针,我认为至少在x86上是安全的。相反,gcc坚持以原子方式加载整个结构,并 https://gcc.gnu.org/bugzilla/show_bug.cgi?id=80835 )

    推荐文章