您能否将具有更严格内存排序的原子加载存储拆分为单独的宽松加载存储以及内存屏障指令?

2024-03-03

下面是用于跨线程数据同步的获取-释放语义的简单示例。

// thread 1                                     // thread 2
data = 100;
flag.store(true, std::memory_order_release);
                                                while(!flag.load(std::memory_order_acquire));
                                                assert(data == 100);

据我了解,这准确地表明了获取-释放内存顺序的使用,并且程序将按预期工作。

但如果我使用独立屏障会怎样?

// thread 1                                     // thread 2
data = 100;
std::atomic_thread_fence(std::memory_order_release);
flag.store(true, std::memory_order_relaxed);
                                                while(!flag.load(std::memory_order_relaxed))
                                                    std::atomic_thread_fence(std::memory_order_acquire);
                                                assert(data == 100);

我一直以为这是exactly相当于第一个例子。

但今天我在 CppCon 上观看了 Herb Sutter 的演讲(C++ 及未来 2012 年:Herb Sutter - 原子武器 https://youtu.be/A8eCGOqgvH4?t=4030). At 1:07:10在视频中,他举了一个例子来表明独立围栏并不是最理想的。看完后我很困惑。

例子是这样的:

   // thread 1                                     // thread 2
   widget *temp = new widget();
XX mb();  XXXXXXXXXXXXXXXXXXXXX  // a
   global = temp;
                                                   temp2 = global;
                                                XX mb();  XXXXXXXXXXXXXXXXXXXXX  // b
                                                   temp2->do_something();
                                                   temp2 = global;
                                                XX mb();  XXXXXXXXXXXXXXXXXXXXX
                                                   temp2->do_something_else();

他说,在 a 和 b 处,您需要一个完整的屏障,而不仅仅是释放和获取,因为它们与任何特定的存储或负载无关。此外,他说,独立的获取和释放障碍没有任何意义。它是否正确? (为了简单起见,假设对 global 的读取和写入是不可分割的,即 global 永远不会包含撕裂值)。

为什么这不起作用?

   // thread 1                                     // thread 2
   widget *temp = new widget();
XX release();  XXXXXXXXXXXXXXXX  // a
   global = temp;
                                                   temp2 = global;
                                                XX acquire();  XXXXXXXXXXXXXXXX  // b
                                                   temp2->do_something();
                                                   temp2 = global;
                                                XX acquire();  XXXXXXXXXXXXXXXX
                                                   temp2->do_something_else();

None

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

您能否将具有更严格内存排序的原子加载存储拆分为单独的宽松加载存储以及内存屏障指令? 的相关文章

随机推荐

  • 学习 WCF RIA 服务的最佳资源

    您正在查看哪些书籍 视频 文章来了解如何使用新发布的 Silverlight WCF RIA 服务 1 起点是http www silverlight net getstarted riaservices http www silverli
  • nginx:将 ssl 连接转发到另一台服务器

    我有一个 nginx 主服务器 决定将请求路由到的传入服务器名称 对于两个辅助服务器 此主 nginx 服务器还保存 ssl 证书和密钥 第三台服务器拥有自己的证书和密钥 因为这些证书和密钥的更新过程很频繁 我现在的问题是如何配置主 ngi
  • 设置 svnperms 预提交挂钩

    我正在尝试将 svnperms 实现到存储库中 但在一些事情上遇到了困难 pre commit具有执行权限 rwxrwxr x 1 svnadm svn 3018 May 27 10 11 pre commit 这是我在预提交中对 svnp
  • BBP 算法所需的工作精度?

    我希望在低内存环境中计算 Pi 的第 n 位数字 由于我没有可用的小数 这Python 中的纯整数 BBP 算法 http en literateprograms org Pi with the BBP formula 28Python 2
  • vuetify-loader 1.6 与 laravel mix 不兼容,vue-loader 15 目前不支持 oneOf 的 vue 规则

    我正在尝试在 laravel 上安装 vue 我相信我明白了 但是当我运行 npm run watch 或 npm run dev 时 它会生成此错误 我尝试了几件事但无法解决 Error VueLoaderPlugin Error vue
  • Excel:使用外部链接可以提高性能吗?

    我想知道使用外部链接与打开电子表格和复制单元格 使用 VBA 相比是否有性能提升 我想 Excel 必须以同样的方式打开文件 但是当我使用以下代码进行测试时 外部链接速度更快 Dim t As Double Dim rng As Range
  • 使用 Xcode 6 从命令行进行 UIAutomation 测试调用

    在新的 Xcode 版本中 从命令行运行 UIAutomation 测试似乎经常会中断 根据过去的帖子判断 由于从未使用过命令行脚本 我发现了 2012 年的这篇文章 来自命令行的自动化仪器 https stackoverflow com
  • setup.py:如何查找用户指定的括号内的附加内容

    我有一个通过 PyPI 分发的包 其中包含大量数据 PyPI 有 100MB 的限制 我想分发比这更多的数据 数据相当不变 因此在每次代码发布时不断将大量数据推送到 PyPI 似乎也很浪费 相反 我更愿意分发最少的数据 并将大数据选项作为可
  • d3:不规则/分散数据的等高线或曲面图

    我可以采用一组三元组 X Y Z 并立即使用 Python 和 matplotlib 生成一个 平滑 等高线图单次通话 to 三角轮廓 https matplotlib org examples pylab examples tricont
  • 实时调试堆栈溢出

    我有一个托管代码 Windows 服务应用程序 由于托管 StackOverFlowException 该应用程序在生产中偶尔会崩溃 我知道这一点是因为我在崩溃模式下运行了 adplus 并使用 SoS 事后分析了崩溃转储 我什至附加了 W
  • Firebase:从 UID 获取 DisplayName [重复]

    这个问题在这里已经有答案了 我将用户的显示名称存储在 Firebase Auth 中 当同一用户登录时 从 Firebase Auth 获取很简单 但是 当另一个用户登录时 当我拥有帐户的唯一 UID 用户 ID 时 如何获取帐户的显示名称
  • 在 WebApplicationFactory 的配置源中关闭“ReloadOnChange”

    这既是一个问题 也是一个答案 我已经解决了我的问题 但似乎有点不对劲 我最初的问题是在 bitbucket 管道中运行我的 ASP NET Core 集成测试 原因是System IO IOException The configured
  • 不允许 HTTPS 页面运行来自 safari-extension:// URI 的不安全内容

    我在 Safari 9 1 11601 5 17 1 的 Safari 扩展中遇到了奇怪的行为 我尝试使用 safari extension 插入一个新的 Iframe 其 src 指向扩展包中的 html 文件 如果我单击控制台中显示的错
  • 无法在 Google 操作中使用隐式/授权流程来授权用户

    我正在尝试链接到该帐户 这是我的谷歌云功能 var AuthHandler function this googleSignIn googleSignIn this googleSignInCallback googleSignInCall
  • C# - 如何使两个表单相互引用

    我正在用 MS Visual C 编写一个 WindowsForms 应用程序 我需要两个表单才能相互引用 在测试时 我在 Form1 上创建了两个按钮 一个按钮显示 Form2 另一个按钮隐藏它 代码如下 我想对 Form2 做同样的事情
  • 动态变量如何影响性能?

    我对性能有疑问dynamic在 C 中 我读了dynamic让编译器再次运行 但它有什么作用呢 是否必须使用以下命令重新编译整个方法dynamic变量用作参数还是仅那些具有动态行为 上下文的行 我注意到使用dynamic变量可以使简单的 f
  • Git:从一个分支的给定文件中删除所有更改的最佳方法

    我有一个有点混乱的分支 有 20 个左右的提交 我正在准备合并回 master 我已经将其重新设置为脱离 master 仔细观察 我意识到有些文件正在以与该分支完全无关的方式进行修改 并且尚未准备好提交 对这些文件的更改并不局限于特定的提交
  • 使用curl和php自动填写表单

    我正在尝试编写一个自动填写表单然后自动按下提交按钮的脚本 我读过您可以使用curl来发布HTTP请求 但是当表单使用JavaScript处理post请求时 您会做什么 就像下面的代码一样
  • 使 DIV 覆盖 100% 的视口而不是 100% 的主体

    我的帖子是关于http www thepostboard net http www thepostboard net 我需要让当前覆盖 100 视口的黑框覆盖整个页面 只有当您的屏幕需要滚动条才能查看网站时 您才会注意到这一点 否则它看起来
  • 您能否将具有更严格内存排序的原子加载存储拆分为单独的宽松加载存储以及内存屏障指令?

    下面是用于跨线程数据同步的获取 释放语义的简单示例 thread 1 thread 2 data 100 flag store true std memory order release while flag load std memory