volatile的作用: 作为指令关键字,确保本条指令不会因编译器的优化而省略,且要求每次直接读值。简单地说就是防止编译器对代码进行优化。
当要求使用volatile声明的变量的值的时候,系统总是重新从它所在的内存读取数据,而不是使用保存在寄存器中的备份。即使它前面的指令刚刚从该处读取过数据。
C/C++ 中 volatile中提到了以下两点:
- c语言代码中嵌入汇编导致错误:由于刚刚从该处读取过数据A,所以就直接从寄存器中取数据A(gcc的优化策略)。但是内存的中的数据A已经被嵌入的汇编代码所修改了(编译器无法发现这个改变),这就导致得到的数据A和期望的不同。
- 多线程下的volatile:当两个线程都要用到某一个变量且该变量的值会被改变时,应该用 volatile 声明,该关键字的作用是防止优化编译器把变量从内存装入 CPU 寄存器中。如果变量被装入寄存器,那么两个线程有可能一个使用内存中的变量,一个使用寄存器中的变量,这会造成程序的错误执行。volatile 的意思是让编译器每次操作该变量时一定要从内存中真正取出,而不是使用已经存在寄存器中的值