了解 C++ 中的顺序一致性栅栏

2023-12-24

我正在阅读有关 C++ 中的内存顺序的内容。我可以很好地理解放松和获取-释放模型。但我正在努力解决顺序一致性问题。

如果我没记错的话,从参考参数 https://en.cppreference.com/w/cpp/atomic/memory_order#:%7E:text=same%20atomic%20variable.-,memory_order_seq_cst,-A%20load%20operation, std::memory_order_seq_cst“操作”相当于:

  • 当操作为“加载”时,获取操作加上单个总订单。
  • 当操作为“存储”时,释放操作加上单个总订单。
  • 当操作为“读-修改-写”时,acq-rel 操作加上单个全序。

但到底是什么情况std::memory_order_seq_cst'栅栏'?它相当于其中的哪一个?

  • 获取栅栏加上单个总订单。
  • 释放栅栏加上单个总订单。
  • 一个 acq-rel 围栏加上一个总订单。

如果和上面其中之一是等价的,那另外两个呢?

据我所知,如果是情况 1(获取栅栏),编译器可以自由地将任何写操作从栅栏上方移动到栅栏下方。类似地,如果是情况 2(释放栅栏),编译器可以自由地将任何读取操作从栅栏下方移动到栅栏上方。最后,如果是情况 3(acq-rel 栅栏),则不允许编译器跨栅栏移动任何指令。它是否正确?

我仍然很困惑。以上说法可能不正确。有不对的地方请指正。


简而言之,就是情况3。

A seq_cst栅栏包括栅栏的所有功能acq_rel栅栏。参见 [atomics.fences p5.5]:

是一个顺序一致的获取和释放栅栏,如果order == memory_order::seq_cst.

因此,它特别是一个获取和释放栅栏。而且它也是一个顺序一致的栅栏,这意味着它以与那里规定的规则一致的方式包含在[atomics.order p4]中定义的总顺序S中。

正式的C++内存模型没有“重新排序”的概念。然而,你是对的,一个典型的实现seq_cst栅栏可以防止货物和物资在任一方向上重新排序。请注意,这严格强于acq_rel栅栏,这将允许栅栏之前的存储与栅栏之后的负载一起重新排序(StoreLoad 重新排序)。

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

了解 C++ 中的顺序一致性栅栏 的相关文章

随机推荐

  • head.ready() 与 $(document).ready

    最近发现了head js http headjs com 图书馆和男孩 我对此感到满意 尽管我仍然对一件事感到有点困惑 来自 headjs com 当脚本到达时 DOM 就绪 事件 例如 document ready 已经被触发 如果加载的
  • vscode 中是否有原生 api 可以通过 glob 匹配文档文件?

    我有一个vscode TextDocument并想检查文件是否与 glob 匹配 const documentFilter vscode DocumentFilter pattern md const matches vscode lang
  • 使用 Python 3 将 LF 打印到 Windows 标准输出

    如何获得 n在 Windows 上打印到标准输出 此代码适用于 Python 2 但不适用于 Python 3 set sys stdout to binary mode on Windows import sys os msvcrt ms
  • jQuery:after() 和 insertAfter() 有什么区别

    jQuery 有一个 after 方法 也是一种 insertAfter 方法 他们之间有什么区别 我想我可以用 after 在选定的元素 或多个元素 之后插入元素 是对的吗 什么是 insertAfter for 它们是相互对立的 aft
  • 什么是软可达物体?

    我试图通过这篇 Java 中的软引用 文章来研究软引用的含义 https www baeldung com java soft references https www baeldung com java soft references 我
  • Windows Spark 错误 java.lang.NoClassDefFoundError:无法初始化类 org.apache.spark.storage.StorageUtils

    下载了最新的apache 3 2 0以及hadoop文件 java Java SE Development Kit 17 0 1 也已安装 我什至无法初始化 input import pyspark from pyspark sql imp
  • 移动大数字

    X 712360810625491574981234007851998使用链表表示 每个节点都是一个unsigned int 有没有快速的方法X lt lt 8罢工 gt X lt lt 591除了之外X 2 8罢工 gt X 2 591
  • pandas 到 gbq 声称架构不匹配,而架构完全相同。在 github 上,所有问题都声称已于 2017 年解决

    我试图通过 pandas 将一个表附加到另一个表 从 BigQuery 中提取数据并将其发送到不同的 BigQuery 数据集 虽然表架构完全相同 但我收到错误 请验证结构和 pandas gbq gbq InvalidSchema 请验证
  • 将字符串写入输出流

    我有几个正在实现的输出侦听器OutputStream 它可以是PrintStream写入标准输出或文件 也可以写入内存或任何其他输出目的地 因此 我指定OutputStream作为方法中的 一个 参数 现在 我已经收到了String 在这里
  • 缓冲输入流标记读取限制

    我正在学习如何使用输入流 我试图对 BufferedInputStream 使用标记 但是当我尝试重置时 出现以下异常 java io IOException Resetting to invalid mark 我认为这意味着我的标记读取限
  • Three.js 投影仪和射线对象

    我一直在尝试使用 Projector 和 Ray 类来进行一些碰撞检测演示 我开始尝试使用鼠标来选择对象或拖动它们 我看过使用这些对象的示例 但似乎没有一个注释能够解释 Projector 和 Ray 的某些方法到底在做什么 我有几个问题
  • 插入 USB 驱动器时启动 PowerShell 脚本

    有什么方法可以在 USB 驱动器插入 PC 时立即启动位于 USB 驱动器上的 PowerShell 脚本吗 它必须将所有 PDF 文件从 PC 复制到 USB 驱动器 但这不是问题 我唯一不知道的是如何在插入 USB 驱动器后立即启动脚本
  • Canvas.toDataURL() 解决方法?

    好的 我的一个朋友请我帮助他为他正在开发的移动网站创建一个画布绘画应用程序 然而 他无法将 画作 保存到服务器上 我做了一些检查 发现在当前版本的浏览器 基于 WebKIt IIRC 中 toDataURL 支持被随机丢弃 是否有任何解决方
  • 本地主机与真实IP地址

    本地主机和真实IP地址有什么区别 如果我使用访问应用程序http localhost 8080 index html and http 192 123 456 001 8080 index html 例如192 123 456 001是主机
  • ThreeJS:从屏幕 2D 坐标转换为相机近平面上的世界 3D 坐标? R73

    我在坐标转换方面遇到了一些麻烦 我在屏幕上有一个具有已知坐标 x y 的对象 我想将其转换为世界坐标 x y z 因为它将投影在相机的近平面上 到目前为止 我可以像这样在 Z 平面上进行投影 var vector new THREE Vec
  • 使 proj_api.h 可用于 pip install cartopy

    我正在尝试安装cartopy via pip install cartopy 我已经安装了proj 4它已经在这里放置了必要的文件 Downloads proj 4 9 2 ls l usr local include proj api h
  • 无法将计数标签放置在存在异常值的箱线图须处

    我试图将观察计数的标签放置在箱线图胡须的末端 但当存在异常值时它似乎不起作用 我尝试将最大 最小值与我认为计算出的晶须长度 四分位数 1 或四分位数 3 或 1 5 四分位数范围 进行比较 但标签既不会放置在最大 最小值处 也不会放置在胡须
  • 使用 awk 在文件中查找字符串

    所以我想从文件中抓取一个字符串 文件包含数据 Id Name CreationDate Comment 1 testing 19 10 11 created by jag 2 develop 19 10 12 created by jag
  • (FB Instant games) 我如何获取/设置屏幕分辨率?

    如何在移动 Facebook 应用程序或 Messenger 中获取 设置即时游戏的屏幕分辨率 我尝试通过 window screen width 和 window innerWidth 获得它 它返回了我360像素 但我在Chrome浏览
  • 了解 C++ 中的顺序一致性栅栏

    我正在阅读有关 C 中的内存顺序的内容 我可以很好地理解放松和获取 释放模型 但我正在努力解决顺序一致性问题 如果我没记错的话 从参考参数 https en cppreference com w cpp atomic memory orde