自从将我们的开发和构建环境从 VS2008 升级到 VS2012 以来,我对使用volatile
我们的遗留代码库中的关键字(它非常广泛,因为有很多复制的模式用于管理“旧”时代的线程)。
微软在VS2012文档中有如下备注:
如果您熟悉 C#volatile关键字,或熟悉的行为volatile在早期版本的 Visual C++ 中,请注意 C++11 ISO 标准volatile关键字不同,并且在 Visual Studio 中受支持/volatile:iso
指定了编译器选项。 (对于 ARM,默认指定)。这volatileC++11 ISO 标准代码中的关键字仅用于硬件访问;不要将其用于线程间通信。对于线程间通信,使用诸如std::atomic<T>
来自 C++ 标准模板库。
它接着说:
当。。。的时候/volatile:ms
使用编译器选项(默认情况下,当目标架构不是 ARM 时),除了维护对其他全局对象的引用的顺序之外,编译器还会生成额外的代码来维护对易失性对象的引用之间的顺序。
我认为这意味着,我们现有的代码不会破坏,但不一定是可移植的(对我们来说不是问题)。
然而,它确实提出了这些问题,如果可能的话,我希望得到一些建议:
- 我们是否应该删除
volatile
即使我们不会将代码从 MS 移植出去,我们的代码中也会包含限定符并替换为符合 C++11 ISO 标准的等效项吗?
- 如果我们不这样做,会有什么坏处吗?
我知道这实际上并不是一个特定的编程问题,但我们正在着手进行一些相当重大的重构,我希望能够为这项工作提供一些合理的指导方针。
- 如果你有时间的话。好处并没有那么大 - C++11 原子可以允许更精确地控制您需要的同步类型,并且具有更清晰定义的语义,这可能允许编译器更好地优化代码。
- 从理论上讲,编译器的未来版本可能会完全放弃对 MS 风格的 易失性的支持,但可能性很小。或者有一天,您确实想要脱离 MS 编译器,即使您仍然使用 Windows。如果您现在正在进行重构,那么这可能是用原子替换易失性的好时机,这样您就不必在将来做这些工作了。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)