7

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

微软在 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 以外的体系结构时)编译器会生成额外的代码来维护对易失性对象的引用之间的顺序,以及维护对其他全局对象的引用的顺序。

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

但是,它确实提出了这些问题,如果可能的话,我想对此提出一些建议:

  1. 我们是否应该在我们的代码中删除使用volatile限定符并替换为符合 C++11 ISO 标准的等效项,即使我们不会将代码移植到 MS 之外?
  2. 如果我们不做上述事情,有什么缺点吗?

我很欣赏这并不是一个真正的特定编程问题,但我们正在着手进行一些非常重要的重构,我希望能够为这项工作提供一些明智的指导。

4

1 回答 1

6
  1. 如果你有时间。好处不是很大——C++11 原子可以更精确地控制你需要什么样的同步,并且具有更清晰定义的语义,这可以让编译器更好地优化代码。
  2. 理论上,但不太可能,编译器的未来版本可能会完全放弃对 MS 风格的 volatile 的支持。或者有一天你确实想从 MS 编译器移植出去,即使你留在 Windows 上。如果您现在正在进行重构,那么这可能是用原子替换 volatile 的好时机,从而使您免于在未来进行这项工作。
于 2013-05-02T14:44:36.100 回答