众所周知,std::atomic和volatile是两个不同的东西。
主要有两点不同:
两个优化可以用于std::atomic<int> a;,但不能用于volatile int a;
- fused operations: `a = 1; a = 2;` can be replaced by the compiler on `a = 2;`
- constant propagation: `a = 1; local = a;` can be replaced by the compiler on`a = 1; local = 1;`
跨原子/易失性操作的普通读/写的重新排序:
编译器不能消除或重新排序对volatile-qualified变量的读/写。
但是,如果存在其他变量,这些变量可能是也可能不是volatile-qualified,那该怎么办呢?
场景1
volatile int a;
volatile int b;
a = 1;
b = 2;
a = 3;
b = 4;
编译器可以重新排序第一个和第二个赋值,或者第三个和第四个赋值吗?
场景2
volatile int a;
int b, c;
b = 1;
a = 1;
c = b;
a = 3;
同样的问题,编译器可以重新排序第一个和第二个赋值,或者第三个和第四个赋值吗?