迄今看到的关于C++ Volatile最完美的一篇技术文章,写的非常好:
C/C++ Volatile关键词深度剖析(由于原文很多图都被盗链屏蔽了,所以选了这篇转载)
另外也可以看一下关于Volatile的一些官方的说明。
先来看一下volatile的官方解释:
Indicates that a variable can be changed by a background routine.
Keyword volatile is an extreme opposite of const. It indicates that a variable may be changed in a way which is absolutely unpredictable by analysing the normal program flow (for example, a variable which may be changed by an interrupt handler). This keyword uses the following syntax:
volatile data-definition;
Every reference to the variable will reload the contents from memory rather than take advantage of situations where a copy can be in a register.
翻译:
表明变量能被后台程序修改
关键字volatile和const是完全相反的。它表明变量可能会通过某种方式发生改变,而这种方式是你通过分析正常的程序流程完全预测不出来的。(例如,一个变量可能被中断处理程序修改)。关键字使用语法如下:
volatiledata-definition;
每次对变量内容的引用会重新从内存中加载而不是从变量在寄存器里面的拷贝加载。
c/c++中的volatile关键字,用来修饰变量,通常用于语言级别的 memory barrier,在"The C++ Programming Language"中,对volatile的描述如下:
A volatile specifier is a hint to a compiler that an object may change its value in ways not specified by the language so that aggressive optimizations must be avoided.
翻译:
volatile是一种类型修饰符,被volatile声明的变量表示随时可能发生变化,每次使用时,都必须从变量对应的内存地址读取,编译器对操作该变量的代码不再进行优化。
下面是一个常见用法:
class Thread {
public:
X()
: _stop(false) {
}
void stop() {
_stop= true;
}
void run() {
while (!_stop) {
work();
}
}
private:
volatile bool _stop;
};
这里在多线程环境下使用volatile变量作为状态标志,每个线程都是从内存地址来读取变量值,因此当一个线程改变了变量值,其他线程马上就可以取到最新状态。
volatile诞生于单CPU核心时代,为保持兼容,一直只是针对编译器的,对CPU无影响,所以要注意volatile解决不了多核时代的线程安全问题。
volatile在C/C++中的作用:
1) 告诉编译器不要将定义的变量优化掉;
2) 告诉编译器总是从缓存取被修饰的变量的值,而不是寄存器取值。
网友评论