在VS2012中使用'volatile'关键字的最佳实践
Best practice for using the 'volatile' keyword in VS2012
自从将我们的开发和构建环境从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时),除了维护对其他全局对象的引用的顺序之外,编译器还生成额外的代码来维护对易失性对象的引用之间的顺序。
我认为这意味着,我们现有的代码不会被破坏,但不一定是可移植的(对我们来说不是问题)。
然而,它确实提出了这些问题,如果可能的话,我希望得到一些建议:
- 我们是否应该在我们的代码中删除
volatile
限定符的使用,并替换为c++ 11 ISO标准兼容的等级物,即使我们不会从MS移植代码? - 如果我们不这样做,有什么缺点吗?
我知道这并不是一个具体的编程问题,但我们正在着手进行一些相当重要的重构,我希望能够为这项工作提供一些合理的指导。
- 如果你有时间的话。好处并不是那么大——c++ 11原子可以更精确地控制你需要的同步类型,并且有更清晰的语义定义,这可能允许编译器更好地优化代码。
- 理论上,但非常非常不可能,编译器的未来版本可能会完全放弃对ms风格volatile的支持。或者有一天你真的想要离开MS编译器,即使你还在Windows上。如果你现在正在做重构,这可能是一个很好的时间来做用原子代替易失性的工作,节省你将来做的工作。
相关文章:
- Visual Studio 2015:Extern "C" 和 "export" 关键字
- 在C#中处理C++指针而不使用unsafe的最佳方法
- C++中的"inline"关键字
- 如何确保C++函数在定义之前声明(如override关键字)
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- 在c代码之间共享数据的最佳方式
- 使用std::source_location报告错误的最佳实践
- 派生类销毁的最佳实践是什么
- 将寄存器设计成可由C和C++访问的外设的最佳实践
- 在两台机器之间进行时间戳的最佳c++chrono函数是什么
- 使用QQuickFramebufferObject时同步数据的最佳方式是什么
- 在C++中向零方向近似的最佳方法
- 使用不同的CRT将新的C++代码与旧的(二进制)组件隔离开来的最佳方法是什么
- 从嵌套在std::映射中的std::列表中删除元素的最佳方式
- 谷歌模拟和覆盖关键字
- 如果条件为TRUE(最佳方式?),则在do while循环中后置增量
- 检测win32服务创建和删除的最佳方法
- 在VS2012中使用'volatile'关键字的最佳实践
- 编写没有new和delete关键字的c++?最佳方法