https://www.cnblogs.com/yc_sunniwell/archive/2010/07/14/1777432.html
1.volatile关键字的使用
int x = 1;
int a = x;
int b = x; // 这时候b的值可能是直接从a里面取得。。。
volatile是指,访问变量时,必须从变量的内存里面取而不能做优化
volatile int i = 10;
int a = i;
printf("i = %d", a);
__asm {
mov dword ptr [ebp-4], 20h
}
int b = i;
printf("i = %d", b);
}
结果: 10, 10
2.volatile指针:
volatile char* vpch; // 修饰指针指向的对象
char* volatile p1; // 修饰指针本身自己的值
3.多线程下的volatile
volatile的意思是让编译器每次操作该变量时
一定要从内存中真正取出,而不是使用已经存在寄存器中的值
volatile BOOL bStop = FALSE;
(1) 在一个线程中:
while( !bStop ) { ... }
bStop = FALSE;
return;
(2) 在另外一个线程中,要终止上面的线程循环:
bStop = TRUE;
while( bStop );
//等待上面的线程终止,如果bStop不使用volatile申明,
那么这个循环将是一个死循环,因为bStop已经读取到了寄存器中,
寄存器中bStop的值永远不会变成FALSE,加上volatile,
程序在执行时,每次均从内存中读出bStop的值,就不会死循环了。
这个关键字是用来设定某个对象的存储位置在内存中,而不是寄存器中。
因为一般的对象编译器可能会将其的拷贝放在寄存器中用以加快指令的执行速度,
例如下段代码中:
...
int nMyCounter = 0;
for(; nMyCounter<100;nMyCounter++)
{
...
}
...
在此段代码中,nMyCounter的拷贝可能存放到某个寄存器中
(循环中,对nMyCounter的测试及操作总是对此寄存器中的值进行),
但是另外又有段代码执行了这样的操作:nMyCounter -= 1;
这个操作中,对nMyCounter的改变是对内存中的nMyCounter进行操作,
于是出现了这样一个现象:nMyCounter的改变不同步。