本文根据百度知道,总结。
示例:
#include <stdio.h>
int main()
{
int i = 10;
//或者volatile int i =10;
//这两种情况在debug下是相同的,而在release下是不同的,原因就是release下编译器对变量i做了优化
//__asm{}中的代码是在编译器未知的情况下对i的值进行更改。
//所以release下编译器认为i的值一直没有变化(而实际i的值已经改变),在没有使用volatile关键时对i进行了优化,即把i的值写入寄存器,两次赋值操作直接从寄存//器读取i值,加快了代码执行速度。但结果是错误的。
int a = i;
printf("i = %d\n", a);
__asm{
mov dword ptr [ebp-4], 20h
}
int b = i;
printf("i = %d\n", b);
}
volatile在多线程中的作用.
class Gadget
{
public:
void Wait()
{
while(!flag_)
{
Sleep(1000);
}
}
void WakeUp()
{
flag_=true;
}
private:
bool flag_;
}
在多线程中,Wait函数是错误的。
当一个线程调用Wait函数,另一个线程中调用WakUp函数是不能使调用Wait函数的线程结束的。