原子变量:
能够保证其上的所有操作都是原子性的,不可分割的;使用默认的内存序模型的原子变量可以保证编译器或者硬件不会对相关代码或指令进行重排;
volatile变量:
不保证其上的所有操作都是原子性的;编译器可能会对相关代码进行重排,或者CPU硬件进行指令重排;告诉编译器不会优化那些冗余代码:
int x
;
x
= 20;
x
= 30;
auto y
= x
;
y
= x
;
volatile变量能够使得CPU对变量的存取直接放到内存中,而不是临时放到寄存器中。原子变量也可以加上volatile修饰符(实际上,编译器厂商对原子变量的实现基本都加上了volatile修饰符)。