自 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 赫伯·萨特

volatileatomic是两个正交的概念。所以他们的组合改变了程序的语义,否则他们就不是正交的了!

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;所有写入都不会被折叠,内存顺序将确保操作将在所有这些写入之间执行。

另请参阅: