InterlockedIncrement参数声明为volatile的影响是什么

时间:2010-09-14 10:50:53

标签: c++ c winapi volatile

InterlockedIncrement和其他Interlocked操作将其参数声明为volatile。为什么?这是什么意图和影响?

4 个答案:

答案 0 :(得分:9)

可能的影响很小。最可能的意图是允许用户将volatile - 限定变量传递给这些函数,而无需进行类型转换。

答案 1 :(得分:4)

这样做是为了可以在正常变量和volatile变量上调用该函数。您不能将volatile变量传递给不期望volatile参数的函数。以下代码无法编译(使用Visual Studio 2005 C ++编译器测试):

void TestV(int *a)
{
  *a = 1;
}

void Test()
{
  volatile int a = 0;
  TestV(&a);
}

声明就是这样,您可以执行以下操作:

volatile LONG a = 0;

InterlockedIncrement(&a);

因为它很可能在volatile变量上调用InterlockedIncrement,所以将它声明为这样是明智的。

答案 2 :(得分:-1)

volatile参数阻止编译器进行阻止读取内存的优化。只要代码的可见效果相同,编译器就可以进行它喜欢的任何优化,但这些效果在多线程场景中不被考虑,只能从单个线程中考虑。 volatile关键字告诉编译器这个变量可以被修改或从外部的,不可知的源读取,编译器无法摆脱它或者对它进行内存访问。

答案 3 :(得分:-2)

简而言之,volatile意味着“此变量可能会在此程序之外修改”。

换句话说,这意味着变量的值可以在代码中没有任何相关指令的情况下更改。例如,它通常用于低级I / O,其中寄存器或缓冲区的值可以由硬件设置。