volatile是c++的关键字之一,其修饰的变量表示容易被修改,要求编译器不要对其读写进行优化。
volatile主要有以下特点:
1:对其修饰的变量,每次读取必须去内存中读取数据,而不相信寄存器或者cache中的数据准确性。
2:vs中,在同一个线程中,volatile修饰的变量的,对于其读操作,在其之后的所有写操作都会在读之后完成,不会被编译器优化乱序执行影响到,对于其写操作,所有在其写之前的读操作都会被在写之前完成,不会被编译器优化影响。所以以下代码的正确性得以保障:
#include <iostream>
#include <windows.h>
using namespace std;
volatile bool Sentinel = true;
int CriticalData = 0;
unsigned ThreadFunc1( void* pArguments ) {
while (Sentinel)
Sleep(0); // volatile spin lock
// CriticalData load guaranteed after every load of Sentinel
cout << "Critical Data = " << CriticalData << endl;
return 0;
}
unsigned ThreadFunc2( void* pArguments ) {
Sleep(2000);
CriticalData++; // guaranteed to occur before write to Sentinel
Sentinel