在VS2012中使用'volatile'关键字的最佳做法

Rog*_*and 7 c++ visual-c++ c++11 visual-studio-2012

自从我们的开发和构建环境从VS2008升级到VS2012以来,我对volatile在我们的遗留代码库中使用关键字的含义感到困惑(由于从"旧"时代管理线程有很多复制模式,因此它非常广泛).

Microsoft在VS2012文档中有以下评论:

如果您熟悉C#volatile关键字,或熟悉早期版本的Visual C++ 中volatile的行为,请注意C++ 11 ISO标准volatile关键字不同,并且在/volatile:iso指定编译器选项时在Visual Studio中受支持.(对于ARM,默认情况下指定).C++ 11 ISO标准代码中的volatile关键字仅用于硬件访问; 不要将它用于线程间通信.对于线程间通信,请使用std::atomic<T>来自C++标准模板库的机制.

它继续说:

当使用/volatile:ms编译器选项时 - 默认情况下,当ARM以外的体系结构成为目标时 - 除了维护对其他全局对象的引用的排序之外,编译器还会生成额外的代码以维护对volatile对象的引用之间的顺序.

我认为这意味着我们现有的代码不会破坏但不一定是可移植的(对我们来说不是问题).

但是,如果可能的话,它确实提出了这些问题,我希望得到一些建议:

  1. 我们是否应该volatile在我们的代码中删除限定符的使用并替换为符合C++ 11 ISO标准的等价物,即使我们不会将代码从MS中移除?
  2. 如果我们不这样做,是否有任何缺点?

我知道这不是一个特定的编程问题,但我们正在进行一些非常重要的重构,我希望能够为这项工作提供一些明智的指导.

Seb*_*edl 6

  1. 如果你有时间的话.好处并不是那么好--C++ 11原子可能允许更精确地控制您需要的确切类型的同步,并且具有更明确定义的语义,这可以允许编译器更好地优化代码.
  2. 从理论上讲,但非常不太可能,未来版本的编译器可能会完全放弃对MS风格的volatile的支持.或者有一天你实际上想要远离MS编译器,即使你留在Windows上也是如此.如果您现在正在进行重构,那么这可能是用原子替换挥发物的工作的好时机,从而使您无法在将来进行工作.