实验
结论
- volatile 指出 i 是随时可能发生变化(易挥发)的,每次使用它的时候必须从 i的地址中读取。
比如,i变量虽然在当前进程看起来像个常量,但随时可能被其他进程修改,因此每次使用的时候都应该从i的地址中读取。
或者,i是个外设寄存器,随时都可能被外设/其他处理器修改,因此读取的时候也应该从i的地址中读取。 - 编译器遇到volatile关键字声明的变量,对访问该变量的代码就不再进行优化,从而可以提供对特殊地址的稳定访问。
进阶
volatile是禁止编译器对指令重排,但是重不重排还是cpu说的算。
重排指令可能会导致功能出错? 编译器可能会重排指令? CPU也可能会重排指令。
要求:
1 “做饭”和“叫吃饭”的指令不能乱序;
2 “叫吃饭”时,一定要保证“做饭”指令执行完毕;
3 “做饭”指令执行完毕,具体指的是饭做好了,而且必须盛到碗里而不是还放在锅里,保证干饭人来了后必须立刻能吃到饭。
怎样禁止编译器重排指令?
volatile
怎样禁止处理器重排指令?
插入fence? 或者锁?
参考:
https://www.runoob.com/w3cnote/c-volatile-keyword.html
https://www.jianshu.com/p/2643c9ea1b82