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

2024-02-03

自从将我们的开发和构建环境从 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 时),除了维护对其他全局对象的引用的顺序之外,编译器还会生成额外的代码来维护对易失性对象的引用之间的顺序。

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

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

  1. 我们是否应该删除volatile即使我们不会将代码从 MS 移植出去,我们的代码中也会包含限定符并替换为符合 C++11 ISO 标准的等效项吗?
  2. 如果我们不这样做,会有什么坏处吗?

我知道这实际上并不是一个特定的编程问题,但我们正在着手进行一些相当重大的重构,我希望能够为这项工作提供一些合理的指导方针。


  1. 如果你有时间的话。好处并没有那么大 - C++11 原子可以允许更精确地控制您需要的同步类型,并且具有更清晰定义的语义,这可能允许编译器更好地优化代码。
  2. 从理论上讲,编译器的未来版本可能会完全放弃对 MS 风格的 易失性的支持,但可能性很小。或者有一天,您确实想要脱离 MS 编译器,即使您仍然使用 Windows。如果您现在正在进行重构,那么这可能是用原子替换易失性的好时机,这样您就不必在将来做这些工作了。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐

  • 如何将 tabs.executeScript 与 React 一起使用

    在我的一个组件中 当加载该组件时 我希望我的扩展将脚本注入到运行该扩展的当前选项卡中 该脚本本质上获取源代码并将其保存为字符串 所以 在我的componentWillMount我尝试通过以下方式注入脚本 componentWillMount
  • 解析宏变量名称中包含 %eval 的宏,SAS

    这是一个玩具示例 旨在帮助解决我遇到的更大问题 它本质上涉及在引用更大的宏变量名称时使用 eval 宏 我创建了一个宏变量 x 2 它使用循环 it 的值 从最终输出可以看出该变量已成功创建 但是我只能将其放入日志而不评估 it 1 这当使
  • 是否有贝叶斯信念网络框架“Infer.NET”的 java 替代品?

    java 是否可以替代贝叶斯信念网络框架 Infer NET 如果它具有可扩展性 大型数据集的在线学习 良好的支持 自 2010 年以来最新更新 开源且易于编写网络结构 则更好 所有功能均来自 Infer NET 你也许还应该考虑Samia
  • 应用程序最小化时的 Electron win.flashFrame() 方法

    win flashFrame 使托盘图标闪烁 直到单击该图标并且应用程序窗口再次回到焦点 在 Windows 10 上 但是 如果应用程序最小化 闪烁会在几秒钟后自动结束 甚至无需单击图标 我怎样才能防止这种情况发生 如果窗口最小化 用户将
  • 对对象列表进行排序的算法

    假设您有一个对象列表 用户在工作时几乎使用所有对象 如何对对象列表进行排序 以便列表适应用户最常使用的顺序 您可以使用什么算法来实现这一点 编辑 许多答案建议计算对象的使用次数 这是行不通的 因为所有对象都使用相同的数量 只是顺序不同 在你
  • 在 iPhone UITextView 上打字(如 Twitter)时建议 # 个标签

    我正在构建一个使用主题标签的应用程序 例如 Twitter 或 Tweetbot 当您输入消息时 如果您输入主题标签符号 我会建议与您当前输入的标签相匹配的标签 我已经弄清楚如何让 UITableView 出现并显示主题标签列表 但我不知道
  • 修改音频样本缓冲区的音量增益

    我想增加语音数据缓冲区的音量 重点是我正在使用 DirectSound 并且我有一个主要缓冲区和一个辅助缓冲区 所有流混合都是手动完成的 在语音聊天中 所有参与者都可以拥有独立的音量级别 我将每个流数据乘以一个值 增益 并将其求和到一个缓冲
  • 如何使用键盘快捷键向上/向下移动 Jupyter 笔记本单元格?

    有人知道在 Jupyter 笔记本中向上或向下移动单元格的键盘快捷键吗 找不到捷径 有什么线索吗 以下解决方案适用于 JupyterLab 我目前拥有版本 2 2 6 您必须首先打开键盘快捷键配置文件 在 JupyterLab 中 您可以在
  • Jetty 7:为 Start.java 配置 JNDI

    遵循 Wicket 1 5 的指导 我将项目从 Jetty 6 1 25 转换为 7 5 0 v20110901 我现有的Start java包含以下设置 我用它来配置 JNDI EnvConfiguration envConfigurat
  • Javamail ISO-8859-1 格式

    我使用 Javamail Api 为我的 Android 手机制作了一个电子邮件客户端 如果我尝试使用以下方法获取发件人的邮件地址和收件人的邮件地址 Address froma m getFrom String from InternetA
  • React-chartjs-2 与 ChartJs 3:错误“arc”不是注册元素

    我正在开发一个 React 应用程序 我想在其中显示图表 我尝试使用react chartjs 2 但我找不到让它工作的方法 当我尝试使用 Pie 组件时 出现错误 Error arc is not a registered element
  • StringBuilder.ToString() 的复杂性是多少

    在 C 中 复杂度是多少StringBuilder ToString 是 O 1 O N 还是其他 不同框架版本有所不同 在旧版本中StringBuilder工作于string直接 所以没有额外费用 ToString 它只是直接向您提供数据
  • 创建自定义错误消息 MySQL

    在 MySQL 中 如何为此错误消息创建自定义消息 无法删除或更新父行 外键约束失败 database jenis fasum 约束jenis fasum ibfk 1外键 id kategori 参考kategori fasum id k
  • 无法使用 OpenCV 保存图像

    我试图保存视频文件中的图像 但它无法在我的硬盘驱动器中保存任何图像 我编译了以下程序 没有错误 include
  • UIScrollView 滚动事件阻止 UIView 动画

    我有一组 UIImageView 的动画 它们代表当前值并不断向上滴答作响 理想情况下永远不会停止 视图中也是一个滚动视图或滚动视图 每当我滚动或缩放滚动视图时 动画都会停止 并且当scrollView完全停止移动时再次启动 我相信这是由于
  • 如何在控制台应用程序中隐藏输出(而不是窗口)?

    好吧 让我再澄清一下 我有一个包含许多类的控制台应用程序 每个类中至少有一个 Console WriteLine text 行 我定义了一些参数 当运行应用程序时 它输出的正是我在类中编写的内容 在那里 我想定义一个参数 当我使用该参数运行
  • 有没有一种简单的方法可以通过 boto3 重命名 s3 文件夹?

    我有带文件夹的 s3 存储桶 文件夹内有大文件 我想用 python3 boto3 脚本重命名该文件夹 I read this https adamtheautomator com rename amazon s3 folder pytho
  • 如何使用输出参数调用 .net 方法?

    我只想打电话给生成脚本的方法Microsoft Data Schema ScriptDom Sql Sql100ScriptGenerator http msdn microsoft com en us library dd195523 a
  • Angular 2:在本地 .json 文件中找不到文件

    我看过一些不同的帖子 内容是无法找到本地文件来打开它们 无论它们是图像还是数据文件 但没有一个解决方案对我有用 我的猜测是我缺少一些配置 我正在查找的文件位于名为 data 的文件夹中 与我的 app html 和 app ts 文件位于同
  • 在 VS2012 中使用 'volatile' 关键字的最佳实践

    自从将我们的开发和构建环境从 VS2008 升级到 VS2012 以来 我对使用volatile我们的遗留代码库中的关键字 它非常广泛 因为有很多复制的模式用于管理 旧 时代的线程 微软在VS2012文档中有如下备注 如果您熟悉 C vol