自 C++11 以来,volatile 在并发编程中的用处
Usefulness of volatile in concurrent programming since C++11
我已阅读 this and this answer. I've also searched the book C++ Concurrency in Action,但没有发现任何关于 volatile
的讨论,也没有任何使用它的示例。看起来它根本不是为并发而设计的。那么对于并发编程,仅仅使用atomic、mutex等就足够了,而忘记volatile
吗?是否存在并发问题可能需要 volatile
的情况?
不,在 C++ 中,volatile
关键字告诉编译器不得以任何方式优化变量的形状或形式。这在处理可以从您自己的代码外部更改的内存时非常有用,例如自定义板上的硬件寄存器。
有关 volatile 的更深入指南,您应该阅读 Volatile vs. volatile
赫伯·萨特
volatile
和atomic
是两个正交的概念。所以他们的组合改变了程序的语义,否则他们就不是正交的了!
atomicity 导致顺序限制(包括读写的原子性)。
波动性 导致对变量访问的可取消性的限制。
volatile
不会导致线程之间的任何排序,但它仍然有用。考虑这个显示进度条的程序,计算在一个线程中执行,而另一个线程负责图形:
//thread A
extern std::atomic<int> progress;
//
void compute(){
progress=0;
//do something;
progress=1;
//do something;
progress=2;
//[...] a 100 time.
}
在函数 compute 中,编译器注意到 progress
从未被读取,而只是被多次写入。所以它可以将代码优化为:
void compute(){
//do many thing;
progress=100;
}
通过声明volatile atomic<int> progress;
所有写入都不会被折叠,内存顺序将确保操作将在所有这些写入之间执行。
另请参阅:
我已阅读 this and this answer. I've also searched the book C++ Concurrency in Action,但没有发现任何关于 volatile
的讨论,也没有任何使用它的示例。看起来它根本不是为并发而设计的。那么对于并发编程,仅仅使用atomic、mutex等就足够了,而忘记volatile
吗?是否存在并发问题可能需要 volatile
的情况?
不,在 C++ 中,volatile
关键字告诉编译器不得以任何方式优化变量的形状或形式。这在处理可以从您自己的代码外部更改的内存时非常有用,例如自定义板上的硬件寄存器。
有关 volatile 的更深入指南,您应该阅读 Volatile vs. volatile
赫伯·萨特
volatile
和atomic
是两个正交的概念。所以他们的组合改变了程序的语义,否则他们就不是正交的了!
atomicity 导致顺序限制(包括读写的原子性)。
波动性 导致对变量访问的可取消性的限制。
volatile
不会导致线程之间的任何排序,但它仍然有用。考虑这个显示进度条的程序,计算在一个线程中执行,而另一个线程负责图形:
//thread A
extern std::atomic<int> progress;
//
void compute(){
progress=0;
//do something;
progress=1;
//do something;
progress=2;
//[...] a 100 time.
}
在函数 compute 中,编译器注意到 progress
从未被读取,而只是被多次写入。所以它可以将代码优化为:
void compute(){
//do many thing;
progress=100;
}
通过声明volatile atomic<int> progress;
所有写入都不会被折叠,内存顺序将确保操作将在所有这些写入之间执行。
另请参阅: