对c ++ 11原子变量的哪些操作实际上是原子的?

时间:2019-06-02 16:14:33

标签: c++ c++11 atomic stdatomic

我正在阅读std :: atomic(https://en.cppreference.com/w/cpp/atomic/atomic)上的cpp参考手册,并对实际上原子执行的确切操作感到困惑。

我遇到的主要操作:
 operator =,operator +和operator + =
我知道这些操作是为模板定义的,我不确定它们是否以及何时是原子的。我希望能帮助您理解何时对此类变量执行的操作不是原子操作。

编辑:
我已阅读此处引用的问题: What exactly is std::atomic?,但我仍然感到困惑。例如,假设a是原子int。 a + = 100是否等于a.fetch_add(100)?
在同一行中,a.load(100)是否等于a = 100?

2 个答案:

答案 0 :(得分:1)

在观看@Treebeard的链接https://www.youtube.com/watch?v=ZQFzMfHIxng之后(观看13-15分钟以获取相关信息)
对原子变量执行的任何操作都是原子的。但是,同一行中可以包含多个操作。
因此,例如,给出以下代码:

int a = 1;  
int b=1;   
auto c = std::atomic<int>(0);  
c = a + b;  

最后一行不是原子操作,因为a + b本身是原子,operator =本身是原子。但是,它们一起构成2个操作,这两个操作不是原子的。总之,我建议使用模板的显式函数(例如load(),fetch_add()和store()),而不要使用标准的重载运算符,因为可以保证这些原子操作是原子执行的。

答案 1 :(得分:-1)

如果标准指定操作是原子操作,则。由实施来确保标准的承诺得到遵守。如果实现 not 不能兑现承诺,那么您手上就有不合格的实现。