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;
-
要求:order参数不得为
memory_order_consume
,
memory_order_acquire
memory_order_acq_rel
.
-
通过对象或此对象指向,具有所需的值。
内存受顺序值的影响。
原子地
而不是为了
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
)