在C++ 11 std :: atomic中,用于++, - 和+ =等运算符的memory_order是什么?

Syn*_*ted 2 c++ atomic std c++11

似乎与成员函数不同,您无法指定要使用的memory_order,因此可能会有一些"默认"最终被使用.

jpa*_*cek 7

默认为"顺序一致".


jog*_*pan 6

根据C++标准(§29.7/ 35)时,效果调用的operator++原子类型的A与非原子的基类型C,即,这些中的一个:

C A::operator++() volatile noexcept;
C A::operator++() noexcept;
Run Code Online (Sandbox Code Playgroud)

与调用成员函数的内容相同fetch_add(1),并且根据§29.5(初始声明),后者使用默认参数声明:

C fetch_add(C, memory_order = memory_order_seq_cst) volatile noexcept;
C fetch_add(C, memory_order = memory_order_seq_cst) noexcept;
Run Code Online (Sandbox Code Playgroud)

对于整数类型C,和:

C* fetch_add(ptrdiff_t, memory_order = memory_order_seq_cst) volatile noexcept;
C* fetch_add(ptrdiff_t, memory_order = memory_order_seq_cst) noexcept;
Run Code Online (Sandbox Code Playgroud)

对于地址类型.换句话说,operator++is 使用的默认内存顺序是memory_order_seq_cst.

标准没有做出任何这样的陈述operator+=,尽管似乎很自然地假设在这种情况下operator++也是如此operator+=.

另请注意,标准定义的原子类型函数的一般规则如下:

(§29.6.5/ 2)[...]没有结束的自由函数_explicit具有_explicit与memory_order参数对应的语义memory_order_seq_cst.