自从我们的开发和构建环境从VS2008升级到VS2012以来,我对在我们的遗留代码库中使用volatile
关键字的含义感到困惑(这是非常广泛的,因为有很多复制模式来管理来自“旧”日子。
Microsoft在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以外的体系结构成为目标时 - 除了维护对其他全局对象的引用的排序之外,编译器还会生成额外的代码来维护对volatile对象的引用之间的排序。
我认为这意味着我们现有的代码不会破坏,但不一定是可移植的(对我们来说不是问题)。
然而,如果可能的话,它确实提出了这些问题,我希望得到一些建议:
volatile
限定符的使用,并替换为符合C ++ 11 ISO标准的等价物,即使我们不会将代码从MS中移除?我理解这不是一个特定的编程问题,但我们正在进行一些非常重要的重构,我希望能够为这项工作提供一些合理的指导。
答案 0 :(得分:6)