volatile可以限制编译器对变量的访问做优化,
使得不利用CPU的缓存(寄存器),而到主内存中获得。
关于volatile的使用建议参考:
http://yarchive.net/comp/linux/ACCESS_ONCE.html
对于线程间共享的变量,如果没有lock保护,而且有可能改变的,
都用ACCESS_ONCE(volatile)保护起来吧,
#define ACCESS_ONCE(x) (*(volatile typeof(x) *)&(x))
以免编译器做优化,导致多线程情况下出错。
编译器优化只是保证单线程下是绝对正确的。例如上面url给出的例子:
if (a > MEMORY) {
do1;
do2;
do3;
} else {
do2;
}
然后MEMORY在其他地方被修改了,就导致do3无法执行了。
if (a > MEMORY)
do1;
do2;
if (a > MEMORY)
do3;
linus的忠告:
So the rule is: if you access unlocked values,
you use ACCESS_ONCE(). You don't say "but it can't matter".
Because you simply don't know.