在VS2012中使用'volatile'关键字的最佳实践

Best practice for using the 'volatile' keyword in VS2012

本文关键字:最佳 关键字 volatile VS2012      更新时间:2023-10-16

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

微软在VS2012文档中有以下注释:

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

它接着说:

当使用/volatile:ms编译器选项时(默认情况下,当目标体系结构不是ARM时),除了维护对其他全局对象的引用的顺序之外,编译器还生成额外的代码来维护对易失性对象的引用之间的顺序。

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

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

  1. 我们是否应该在我们的代码中删除volatile限定符的使用,并替换为c++ 11 ISO标准兼容的等级物,即使我们不会从MS移植代码?
  2. 如果我们不这样做,有什么缺点吗?

我知道这并不是一个具体的编程问题,但我们正在着手进行一些相当重要的重构,我希望能够为这项工作提供一些合理的指导。

  1. 如果你有时间的话。好处并不是那么大——c++ 11原子可以更精确地控制你需要的同步类型,并且有更清晰的语义定义,这可能允许编译器更好地优化代码。
  2. 理论上,但非常非常不可能,编译器的未来版本可能会完全放弃对ms风格volatile的支持。或者有一天你真的想要离开MS编译器,即使你还在Windows上。如果你现在正在做重构,这可能是一个很好的时间来做用原子代替易失性的工作,节省你将来做的工作。