自从将我们的开发和构建环境从 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 以外的体系结构时)编译器会生成额外的代码来维护对易失性对象的引用之间的顺序,以及维护对其他全局对象的引用的顺序。
我认为这意味着,我们现有的代码不会破坏,但不一定是可移植的(对我们来说不是问题)。
但是,它确实提出了这些问题,如果可能的话,我想对此提出一些建议:
- 我们是否应该在我们的代码中删除使用
volatile
限定符并替换为符合 C++11 ISO 标准的等效项,即使我们不会将代码移植到 MS 之外? - 如果我们不做上述事情,有什么缺点吗?
我很欣赏这并不是一个真正的特定编程问题,但我们正在着手进行一些非常重要的重构,我希望能够为这项工作提供一些明智的指导。