具有 memory_order_relaxed 的存储是否有可能永远不会到达其他线程?

2023-11-23

假设我有一个线程A写入一个atomic_int x = 0;, using x.store(1, std::memory_order_relaxed);。如果没有任何其他同步方法,其他线程需要多长时间才能看到这一点,使用x.load(std::memory_order_relaxed);?是否有可能写入的值x考虑到标准给出的 C/C++ 内存模型的当前定义,是否完全保持线程本地化?

我手头的实际案例是一个线程B读到atomic_bool经常检查是否必须退出;另一个线程在某个时刻写道true到这个 bool,然后在线程 B 上调用 join() 。显然,我不介意在线程 B 甚至可以看到atomic_bool 已设置之前调用 join() ,也不介意线程 B 之前已经看到更改并退出执行我调用 join()。但我想知道:使用memory_order_relaxed在两侧,是否可以调用 join() 并“永远”阻塞,因为更改永远不会传播到线程 B?

Edit

我联系了 Mark Ba​​tty(数学验证并随后修复 C++ 内存模型要求的大脑)。本来是关于其他事情的(结果是 cppmem 和他的论文中的一个已知错误;所以幸运的是我没有完全出丑,也借此机会向他询问了这个问题;他的回答是:

问:理论上,这样的存储[没有(任何后续)释放操作的内存_顺序_放宽]是否永远不会到达另一个线程?
标记:从理论上讲,是的,但我认为尚未观察到这一点。
问:换句话说,宽松的商店没有意义吗? 无论如何,除非您将它们与某些释放操作结合起来(并且 在另一个线程上获取),假设您希望另一个线程 看见?
标记:是的,几乎所有的用例都使用释放和获取。


这就是标准对此事的全部规定,我相信:

[多线程简介]/25实现应确保原子或同步操作分配的最后一个值(按修改顺序)将在有限的时间内对所有其他线程可见。

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

具有 memory_order_relaxed 的存储是否有可能永远不会到达其他线程? 的相关文章

  • 如何在c++中读取pcap文件来获取数据包信息?

    我想用 C 编写一个程序来读取 pcap 文件并获取数据包的信息 例如 len sourc ip flags 等 现在我找到了如下代码 我认为它会帮助我获取信息 但是我有一些疑问 首先我想知道应该将哪个库添加到我的程序中 然后什么是 pca
  • 在 C 中匹配二进制模式

    我目前正在开发一个 C 程序 需要解析一些定制的数据结构 幸运的是我知道它们是如何构造的 但是我不确定如何在 C 中实现我的解析器 每个结构的长度都是 32 位 并且每个结构都可以通过其二进制签名来识别 举个例子 有两个我感兴趣的特定结构
  • 为什么极端下派生类(多重虚拟继承)的大小包括超类成员大小的两倍?

    include
  • 为什么 Google 测试会出现段错误?

    我是 Google Test 的新手 正在尝试提供的示例 我的问题是 当我引入失败并设置GTEST BREAK ON FAILURE 1 或使用命令行选项 GTest 将出现段错误 我正在考虑这个例子 https code google c
  • qdbusxml2cpp 未知类型

    在使用 qdbusxml2cpp 程序将以下 xml 转换为 Qt 类时 我收到此错误 qdbusxml2cpp c ObjectManager a ObjectManager ObjectManager cpp xml object ma
  • 是否有实用的理由使用“if (0 == p)”而不是“if (!p)”?

    我倾向于使用逻辑非运算符来编写 if 语句 if p some code 我周围的一些人倾向于使用显式比较 因此代码如下所示 if FOO p some code 其中 FOO 是其中之一false FALSE 0 0 0 NULL etc
  • 如何在 Xaml 文本中添加电子邮件链接?

    我在 Windows Phone 8 应用程序中有一些大文本 我希望其中有电子邮件链接 例如 mailto 功能 这是代码的一部分
  • C#:帮助理解 UML 类图中的 <>

    我目前正在做一个项目 我们必须从 UML 图编写代码 我了解 UML 类图的剖析 但我无法理解什么 lt
  • 使用管道时,如果子进程数量大于处理器数量,进程是否会被阻塞?

    当子进程数量很大时 我的程序停止运行 我不知道问题是什么 但我猜子进程在运行时以某种方式被阻止 下面是该程序的主要工作流程 void function int process num int i initial variables for
  • 动态添加 ASP.Net 控件

    我有一个存储过程 它根据数据库中存储的记录数返回多行 现在我想有一种方法来创建 div 带有包含该行值的控件的标记 如果从数据库返回 10 行 则 10 div 必须创建标签 我有下面的代码来从数据库中获取结果 但我不知道如何从这里继续 S
  • Cmake 链接共享库:包含库中的头文件时“没有这样的文件或目录”

    我正在学习使用 CMake 构建库 构建库的代码结构如下 include Test hpp ITest hpp interface src Test cpp ITest cpp 在 CMakeLists txt 中 我用来构建库的句子是 f
  • 为什么 gcc 抱怨“错误:模板参数 '0' 的类型 'intT' 取决于模板参数”?

    我的编译器是gcc 4 9 0 以下代码无法编译 template
  • C++ 函数重载类似转换

    我收到一个错误 指出两个重载具有相似的转换 我尝试了太多的事情 但没有任何帮助 这是那段代码 CString GetInput int numberOfInput BOOL clearBuffer FALSE UINT timeout IN
  • 按 Esc 按键关闭 Ajax Modal 弹出窗口

    我已经使用 Ajax 显示了一个面板弹出窗口 我要做的是当用户按 Esc 键时关闭该窗口 这可能吗 如果有人知道这一点或以前做过这一点 请帮助我 Thanks 通过以下链接 您可以通过按退出按钮轻松关闭窗口 http www codepro
  • 如果没有抽象成员,基类是否应该标记为抽象?

    如果一个类没有抽象成员 可以将其标记为抽象吗 即使没有实际理由直接实例化它 除了单元测试 是的 将不应该实例化的基类显式标记为抽象是合理且有益的 即使在没有抽象方法的情况下也是如此 它强制执行通用准则来使非叶类抽象 它阻止其他程序员创建该类
  • 方法优化 - C#

    我开发了一种方法 允许我通过参数传入表 字符串 列数组 字符串 和值数组 对象 然后使用这些参数创建参数化查询 虽然它工作得很好 但代码的长度以及多个 for 循环散发出一种代码味道 特别是我觉得我用来在列和值之间插入逗号的方法可以用不同的
  • 如何部署“SQL Server Express + EF”应用程序

    这是我第一次部署使用 SQL Server Express 数据库的应用程序 我首先使用实体 框架模型来联系数据库 我使用 Install Shield 创建了一个安装向导来安装应用程序 这些是我在目标计算机中安装应用程序所执行的步骤 安装
  • 无法接收 UDP Windows RT

    我正在为 Windows 8 RT 编写一个 Windows Store Metro Modern RT 应用程序 需要在端口 49030 上接收 UDP 数据包 但我似乎无法接收任何数据包 我已按照使用教程进行操作DatagramSock
  • 如何从 ODBC 连接获取可用表的列表?

    在 Excel 中 我可以转到 数据 gt 导入外部数据 gt 导入数据 然后选择要使用的数据源 然后在提供登录信息后 它会给我一个表格列表 我想知道如何使用 C 以编程方式获取该列表 您正在查询什么类型的数据源 SQL 服务器 使用权 看
  • 从列表中选择项目以求和

    我有一个包含数值的项目列表 我需要使用这些项目求和 我需要你的帮助来构建这样的算法 下面是一个用 C 编写的示例 描述了我的问题 int sum 21 List

随机推荐

  • 从后台线程调用 UIKit 时发出警告

    iOS 的 UIKit 不是线程安全的 这个事实众所周知 我知道这个规则 我很小心 但我还是被咬了 而且时不时地 由此产生的崩溃已经远远远离了对 UIKit 的有问题的后台调用 使得追踪问题成为一种不那么愉快的体验 这个问题似乎很容易解决
  • 从 boost::asio::io_service 中删除所有处理程序而不调用它们

    我想在重用 IO service 之前删除所有处理程序 这可能吗 我正在编写涉及以下内容的单元测试asio io service 在每个测试用例之间 我想从全局中清除处理程序io service 我以为io service reset愿意
  • 为什么 Java 编译器不支持导入的继承?

    在 Java 中 导入与 外部 类相关 因为每个 外部 类都应该在单独的文件中编码 因此 人们可以声称import 类定义之前的指令与该类相关联 有点像注释 现在 如果可以继承父类的导入 这将大大减少源文件的混乱 为什么这不可能 即为什么
  • Python 文本处理:NLTK 和 pandas

    我正在寻找一种在 Python 中构建可与额外数据一起使用的术语文档矩阵的有效方法 我有一些带有一些其他属性的文本数据 我想对文本进行一些分析 并且希望能够将从文本中提取的特征 例如单个单词标记或 LDA 主题 与其他属性相关联 我的计划是
  • AspNet Identity 2.0 电子邮件和用户名重复

    我当前的 Asp Net MVC 5 项目任务电子邮件地址 for UserName 现在我想要upgradeASPNet Identity v1 0 至v2 0利用其所有新功能 see here 然而 ASPNet Identity v2
  • 查找上一页 URL

    我正在尝试查找上一页的 url 例如 用户使用以下命令从页面 A 导航到页面 BServer Redirect B aspx 页面B可以显示引用它的url 我尝试过使用 Response Write Page PreviousPage To
  • Python pandas 将行转换为存在多列的列[重复]

    这个问题在这里已经有答案了 我有一个包含多列的 DF 我想将其从行转换为列 我在堆栈溢出中看到的大多数解决方案仅处理 2 列 From DF PO ID PO Name Region Date Price 1 AA North 07 201
  • 一个线程中对非易失性成员变量的赋值是否保证在另一个线程中可见?

    考虑下面的 Java 示例 请注意 两个类成员变量都没有声明为volatile 如果我正确理解内存模型和 发生在 规则之前 Java 实现可以优化run 方法 使其永远运行 即使另一个线程调用该方法stopNow 方法 发生这种情况是因为里
  • 从数据库代码中删除样板

    看来每次我要执行数据库查询时 我都必须编写以下内容 Connection conn null Statement stmt null ResultSet rset null try conn dataSource getConnection
  • 适当的布尔随机生成器(伯努利分布)

    我很想知道是否有默认的随机布尔生成器randomC 11 库 我一直在使用 int 生成器返回0 or 1然后转换为 bool 但我正在尝试优化我的代码 并认为我可以通过从一开始就使用 bool 生成器 如果存在 来节省成本 See std
  • 砍掉每个变量名称的第一个字母[重复]

    这个问题在这里已经有答案了 我有一些数据看起来像这样 country agdp apop 1 US 100 100 2 Australia 50 50 变量名称是agdp and apop 但我希望他们是gdp and pop 我的真实数据
  • Bootstrap-vue b-table 标头中带有过滤器

    我有一个使用 bootstrap vue 生成的表 显示系统搜索的结果 结果表向用户显示记录 用户可以对它们进行排序和过滤 如何在表格标题下方添加搜索字段 th 使用 bootstrap vue 生成 th
  • 为什么我无法使用 Xamarin 在可移植类库中引用 System.Net.Sockets?

    我正在尝试在可移植类库中使用 System Net Sockets API 以便我的项目可以重用套接字连接代码 但我无法在代码中引用该名称空间 据我了解 PCL 限制您只能使用所有目标平台上可用的程序集 但我的目标是 ios Android
  • C# 与 SharpZipLib - SharpZipLib 与 Winzip 和 XP 的兼容性吗?

    我正在使用SharpZipLib自动压缩某些文件的库 问题是生成的 zip 文件不适用于 Winzip 版本 8 1 或 XP 的压缩文件夹 它确实可以与 7zip 一起使用 Winzip 给出一个错误该文件不是标准 Zip 2 0 格式
  • TabIndex 无法正常工作

    I have a windows form application On the form there are three groupboxs Each groupbox contains some controls Please see
  • 如何在模板绑定中从 Angular 4 访问 getter/setter 访问器?

    假设我有以下 getter setter 方法 get next console log this people this index this index return this people this index set next i
  • 使用 jQuery .filter() 选择 div 中的特定文本

    HTML p class greeting hello my name is kevin what s yours p jQuery p greeting filter function return this text my name i
  • JPA 不生成“删除时设置为空”FK 限制

    我有两个相关的 JPA 注释类 警报和状态 一个警报可以有一个状态 我需要的是能够删除一个状态并将空值 传播 到已删除的该状态中的警报 也就是说 我需要将外键定义为 删除时设置为空 Entity public class Alarm Id
  • PHP 速度与其他语言的比较

    我经常听说 PHP 与其他语言相比速度很慢 速度差异是否足够明显以至于我应该切换到另一种语言 如果是这样 您会推荐什么其他语言 或者有什么好的优化可以加快 PHP 的速度 这个问题经常出现 答案是 是的 它比 C Java C C 等慢 不
  • 具有 memory_order_relaxed 的存储是否有可能永远不会到达其他线程?

    假设我有一个线程A写入一个atomic int x 0 using x store 1 std memory order relaxed 如果没有任何其他同步方法 其他线程需要多长时间才能看到这一点 使用x load std memory