InterlockedIncrement和其他Interlocked操作将它们的参数声明为volatile。为什么?这样做的目的和效果是什么?
InterlockedIncrement和其他Interlocked操作将它们的参数声明为volatile。为什么?这样做的目的和效果是什么?
volatile
限定符的变量传递给这些函数。void TestV(int *a)
{
*a = 1;
}
void Test()
{
volatile int a = 0;
TestV(&a);
}
根据声明的内容,您可以进行以下操作:
volatile LONG a = 0;
InterlockedIncrement(&a);
由于在volatile变量上调用InterlockedIncrement可能具有意义,因此将其声明为这样似乎是明智的。
volatile参数可以防止编译器进行优化,从而防止对内存的读取。只要代码的可见效果相同,编译器可以进行任何优化,但这些效果在多线程场景下不被考虑,仅适用于单个线程。volatile关键字告诉编译器,该变量可能会被外部未知来源修改或读取,编译器不能消除它或省略对其的内存访问。