volatile是被设计用来修饰被不同线程访问和修改的变量
volatile的作用是: 作为指令关键字,确保本条指令不会因编译器的优化而省略,且要求每次直接读值.
一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。
以上内容摘自百度百科
但请注意 : volatile不是用来解决多线程竞争问题的
https://www.zhihu.com/question/31459750/answer/52069135知乎上的解释
#include <stdlib.h>
#include <iostream>
#include <list>
#include <conio.h>
#include <time.h>
#include <algorithm>
#include <windows.h>
//头文件引用较多, 有一些与本程序无关
using namespace std;
int main(int argc, char* argv[])
{
volatile int i = 10;
cout << "i = " << i << endl;
//下面汇编语句的作用就是改变内存中i的值,但是又不让编译器知道
__asm
{
mov dword ptr[ebp-4],20h//把32赋给i, 16进制的20转为10进程是32
}
cout << "i = " << i << endl;
system("pause");
return 0;
}
运行结果(注意在VS2010中要把运行模式改为Release):
i = 10
i = 32
如果i没被volatile修饰的话, i的值不会改变