我看到了一个代码示例演示中的问题C++ volatile member functions的答案volatile
预选赛的使用情况,引用如下:在这种情况下挥发性限定词是否重要?
volatile int x;
int DoSomething() {
x = 1;
DoSomeOtherStuff();
return x+1; // Don't just return 2 because we stored a 1 in x.
// Check to get its current value
}
我不知道,如果volatile
预选赛使得在上面的代码中任何区别。 x
是一个全局变量,并且在x
上的写入和读取之间存在函数调用,并且我们只读取一次x
。编译器不应该在x
上执行真正的读取(即使它不是volatile
)?
我认为这是从下面的情况不同:
volatile int x;
int DoSomething() {
x = 1;
while (x != 1)
break;
}
在这种情况下,我们反复x
写入后立即读取x
,所以volatile
需要得到x
向上的最新值由其他线程编写。
我对自己对这些代码示例的理解不是很有信心,如果我错了,请纠正我。
编辑(回复评论):对不起,我没有把我的问题弄清楚。至于第一个代码片段,我在质疑代码是否是可能的使用volatile
(而不是保证使用易失性)的有效示例。我只是想知道,没有volatile
,假设没有多线程或其他非平凡的东西,比如内存映射IO,是否保证DoSomeOtherStuff()
中x
的任何可能更改都可以反映在return x+1
中。因为如果保证在没有volatile
的情况下工作,那么这个例子就与此相关,甚至不要提到volatile
的平台相关性质,因为有些评论指出。但如果没有保证,那么恐怕我现有的一些代码可能无法按我的预期工作。
(我可能不应该把第二代码片段在所有。)
C++标准保证基本一无所知'volatile'关键字。 (尝试搜索“volatile is uselesss”,如果您正在讨论便携式多线程编程,那么它就是这样)。因此,行为完全取决于平台。请添加标签和/或更新您的问题,以表明您的意思是哪个编译器。 – Nemo
这是一个很好的解释,说明volatile对于多线程编程实际上是非常有用的:http://www.drdobbs.com/cpp/volatile-the-multithreaded-programmers-b/184403766 –
@MikeC:That文章正在对C语言规范中找不到的多线程程序中'volatile'的语义做出假设。如果一个特定的编译器实现碰巧使volatile属性引入了一个内存屏障或者使得一个变量“线程安全”所需要的任何东西(不管*表示什么),那么这是一个不可移植的和实现定义的关键字用法。一个更好的文章指出人们正如Nemo所说:http://software.intel.com/zh-cn/blogs/2007/11/30/volatile-almost-useless-for-multi-threaded-programming/。 –