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

时间:2012-07-21 16:31:39

标签: c++ c++11 std atomic

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

2 个答案:

答案 0 :(得分:7)

默认为“顺序一致”。

答案 1 :(得分:6)

根据C ++标准(§29.7/ 35),使用非原子基类型{{1}调用原子类型operator++的{​​{1}}的效果 },即其中一个:

A

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

C A::operator++() volatile noexcept;
C A::operator++() noexcept;

表示整数类型fetch_add(1),并且:

C fetch_add(C, memory_order = memory_order_seq_cst) volatile noexcept;
C fetch_add(C, memory_order = memory_order_seq_cst) noexcept;

表示地址类型。 换句话说,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;

标准没有对operator++做出任何此类陈述,尽管在这种情况下,memory_order_seq_cst的{​​{1}}的真实性似乎也是正确的。

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

  

(§29.6.5/ 2)[...]不以operator+=结尾的自由函数具有相应operator++的语义,其memory_order参数为operator+=