了解 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++ 中的顺序一致性栅栏 的相关文章

  • 使用Physics.Raycast 和Physics2D.Raycast 检测对象上的点击

    我的场景中有一个空的游戏对象 带有 2D 组件盒碰撞器 我将脚本附加到该游戏对象 void OnMouseDown Debug Log clic 但是当我点击我的游戏对象时 没有任何效果 你有什么想法 如何检测我的盒子碰撞器上的点击 使用光
  • 为 Visual Studio 2013 编译 Tesseract

    我正在尝试使用tesseract在 Visual Studio 2013 中 我在链接器 gt 输入 不是 libtesseract302 static lib 中使用 libtesseract302 lib 一切都正常 并且已编译并运行
  • 启动时出现 OData v4 错误:找不到段“Whatever”的资源

    我正在构建新的 v4 服务 一切进展顺利 直到我为新模型 实体添加了新控制器 并在启动站点进行测试运行时收到此错误 控制器似乎编码正确 就像其他控制器一样 控制器 CustomersOData 中的操作 GetFeed 上的路径模板 Cus
  • 如何将 #ifdef DEBUG 添加到 Xcode?

    我的项目中有一些代码永远不应该在发布版本中使用 但在测试时很有用 我想做这样的事情 ifdef DEBUG Run my debugging only code endif 在 Xcode 4 中哪里添加 DEBUG 设置 我尝试将其放入
  • 如何修复此错误“GDI+ 中发生一般错误”?

    从默认名称打开图像并以默认名称保存 覆盖它 我需要从 Image Default jpg 制作图形 将其放在 picturebox1 image 上并在 picurebox1 上绘制一些图形 它有效 这不是我的问题 但我无法保存 pictu
  • 将 System.Windows.Input.KeyEventArgs 键转换为 char

    我需要将事件参数作为char 但是当我尝试转换 Key 枚举时 我得到的字母和符号与传入的字母和符号完全不同 如何正确地将密钥转换为字符 这是我尝试过的 ObserveKeyStroke this new ObervableKeyStrok
  • 关于在 Windows 上使用 WiFi Direct Api?

    我目前正在开发一个应用程序 我需要在其中创建链接 阅读 无线网络连接 在桌面应用程序 在 Windows 10 上 和平板电脑 Android 但无关紧要 之间 工作流程 按钮 gt 如果需要提升权限 gt 创建类似托管网络的 WiFi 网
  • 如何在 Linq 中获得左外连接?

    我的数据库中有两个表 如下所示 顾客 C ID city 1 Dhaka 2 New york 3 London 个人信息 P ID C ID Field value 1 1 First Name Nasir 2 1 Last Name U
  • 在一个字节中存储 4 个不同的值

    我有一个任务要做 但我不知道从哪里开始 我不期待也绝对不想要代码中的答案 我想要一些关于该怎么做的指导 因为我感到有点失落 将变量打包和解包到一个字节中 您需要在一个字节中存储 4 个不同的值 这些值为 NAME RANGE BITS en
  • 如何将整数转换为 void 指针?

    在 C 中使用线程时 我面临警告 警告 从不同大小的整数转换为指针 代码如下 include
  • 如何使用 watin 中的 FileUploadDialogHandler 访问文件上传对话框

    我正在使用 IE8 和 watin 并尝试通过我的网页测试上传文件 我不能简单地使用 set 方法设置上传文件 例如 ie FileUpload Find ById someId Set C Desktop image jpg 因为上传文本
  • 如何在 Blackberry Cascades 中显示具有特定号码的电话板

    我正在使用带有 C QT 和 QML 的 Blackberry Cascades 10 Beta 3 SDK 以及 Blackberry 10 Dev Alpha Simulator 和 QNX Momentics IDE 并且我正在尝试实
  • 如何使用 Mongodb C# 驱动程序连接多个集合

    我需要将 3 个集合与多个集合合并在一起 lookup我在 C 驱动程序中尝试过 它允许我 lookup用户采集但无法执行秒 lookup用于设置集合 有人可以帮忙吗 db Transactions aggregate lookup fro
  • 将 log4net 与 Autofac 结合使用

    我正在尝试将 log4net 与 Autofac 一起使用 我粘贴了这段代码http autofac readthedocs org en latest examples log4net html http autofac readthed
  • 如何编写一个同时需要请求和响应Dtos的ServiceStack插件

    我需要提供本地化数据服务 所有本地化的响应 Dto 都共享相同的属性 IE 我定义了一个接口 ILocalizedDto 来标记那些 Dto 在请求端 有一个ILocalizedRequest对于需要本地化的请求 Using IPlugin
  • HttpWebRequest 在第二次调用时超时

    为什么以下代码在第二次 及后续 运行时超时 代码挂在 using Stream objStream request GetResponse GetResponseStream 然后引发 WebException 表示请求已超时 我已经尝试过
  • C++ 密码屏蔽

    我正在编写一个代码来接收密码输入 下面是我的代码 程序运行良好 但问题是除了数字和字母字符之外的其他键也被读取 例如删除 插入等 我知道如何避免它吗 特q string pw char c while c 13 Loop until Ent
  • 为什么在setsid()之前fork()

    Why fork before setsid 守护进程 基本上 如果我想将一个进程与其控制终端分离并使其成为进程组领导者 我使用setsid 之前没有分叉就这样做是行不通的 Why 首先 setsid 将使您的进程成为进程组的领导者 但它也
  • memset 未填充数组

    u32 iterations 5 u32 ecx u32 malloc sizeof u32 iterations memset ecx 0xBAADF00D sizeof u32 iterations printf 8X n ecx 0
  • 当另一个线程可能设置共享布尔标志(最多一次)时,是否可以读取共享布尔标志而不锁定它?

    我希望我的线程能够更优雅地关闭 因此我尝试实现一个简单的信号机制 我不认为我想要一个完全事件驱动的线程 所以我有一个工作人员有一种方法可以使用关键部分优雅地停止它Monitor 相当于C lock我相信 绘图线程 h class Drawi

随机推荐

  • 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