我正在阅读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?
答案 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 不能兑现承诺,那么您手上就有不合格的实现。