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

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

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

这样做是为了可以在普通变量和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,所以将它声明为这样是合理的。

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

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

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