我是否需要内存屏障来访问已完成的线程修改的内存?

2023-12-29

[以下为 C++ 术语]

我有一个线程 A 和线程 B 共享对整数值 P 的访问。线程 A 初始化该值并在运行时更新它。然后线程A完成。线程 B 等待线程 A 完成(标准操作系统 API 调用,无论使用什么操作系统)并想要读取 P。

线程 B 是否需要内存屏障来读取线程 A 最后设置的连贯 P 值?是否有可能当操作系统API说“线程A完成”时,它修改的内存更改对其他线程还不可见?

请注意,有only one线程在此处写入值,这可能会也可能不会将此问题与“thread::join 上是否存在具有同步关系的隐式内存屏障? https://stackoverflow.com/questions/42175207/is-there-an-implicit-memory-barrier-with-synchronized-with-relationship-on-threa”之前问过。我的直觉告诉我答案应该是一样的,但是......


join与调用的线程同步join。也就是说,所有的写A使得将变得可见B when B calls A.join().

你可以将其视为A执行std::atomic_thread_fence(memory_order_release)当它完成时B执行std::atomic_thread_fence(std::memory_order_acquire as A joins.

线程B是否需要内存屏障

是的,但它们隐含在join而且你不必写它们。

是否有可能当操作系统API说“线程A完成”时,它修改的内存更改对其他线程还不可见?

调用者以外的线程join将需要额外的同步,例如std::condition_variable or std::atomic_thread_fence(std::memory_order_acquire);

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

我是否需要内存屏障来访问已完成的线程修改的内存? 的相关文章

随机推荐

  • GHC 中自动专业化的传递性

    From the docs http www haskell org ghc docs 7 6 3 html users guide pragmas html idp49866112对于 GHC 7 6 你 通常甚至一开始就不需要 SPEC
  • JQuery IE 生涩幻灯片动画

    我有以下代码来动画显示 隐藏 div headerClosed headerOpen live click function this next slideToggle slow 这将显示并隐藏具有以下标记的 div div class d
  • 登录失败。请检查您的网络连接并重试

    我正在尝试使用 Google Play 游戏服务制作简单的游戏 但无法登录 Google Play 游戏 我明白了error 登录失败 请检查您的网络连接 然后重试 我有 MainActivity 和三个片段 MainFragment Ga
  • 使用 5 个表生成查询

    我已经创建了我的表 我正在尝试创建一个查询 将已售表中的 sell quantity 和 on sale 表中的 sale price 相乘并相加 暂时将其称为 R1 将产品表中的 Retail price 和已售表中的 sell quan
  • 获取 Promise.race 中完成的 Promise

    上下文 我需要进行大量可并行的异步调用 想想大约 300 到 3000 个 ajax 调用 但是 我不想同时调用所有浏览器或服务器 从而给浏览器或服务器带来压力 我也不想按顺序运行它们 因为完成需要很长时间 我决定一次运行五个左右 并派生了
  • Windows Azure 服务总线队列重复检测如何工作?

    我知道您可以设置重复检测以在一段时间内使用天蓝色服务总线队列进行工作 但是 有谁知道这是否基于队列中的对象起作用 因此 如果我有一个 id 为 SO 1 的对象 该对象被放入队列并随后被消耗 重复检测是否仍然有效 我想我要问的是 是时间范围
  • “yield”在这个排列生成器中如何工作?

    def perm generator lst if len lst 1 yield lst else for i in range len lst for perm in perm generator lst i lst i 1 yield
  • 在 gdb 中显示解引用的 STL 迭代器

    我有一个映射元素的迭代器 我希望 gdb 显示该迭代器的 第一个 和 第二个 元素的值 例如 std map
  • 修复非线性最小二乘 GSL 中拟合函数的参数

    我正在编写一些代码 这些代码使用 GNU 科学库 GSL 1 的非线性最小二乘算法进行曲线拟合 我已经成功地获得了一个工作代码 该代码使用来自的 C 包装器从拟合分析中估计了正确的参数https github com Eleobert gs
  • 呼叫 IVR 时动词记录超时的问题

    我们正在尝试使用 Twilio 为这些 IVR 创建自动化测试框架 我们从 Twilio 向 IVR 发出出站呼叫 使用动词 Say Play 与 IVR 进行交互 并使用 Record 来捕获 IVR 所说的内容 然后我们将其转录并做出断
  • C# 二进制数据转换为字符串

    这是交易 我找到了一个源代码并对其进行了一些更改 以便我可以从 com6 上的接收器检索数据 我收到的数据是二进制的 我想要的是将其转换为字符串 以便我可以剪切字符串的一部分并单独解码它们 我怎样才能做到这一点 源代码如下 using Sy
  • 在 Android 上将 mp3 转换为 wav

    关于 wav 到 mp3 的反向转换似乎有很多问题 但没有一个问题是相反的 我的情况是我可以使用隐写术将数据嵌入到 wav 文件中 我可以将它们转换为 ogg 并返回 隐写术与格式无关 并且可以在格式转换后继续存在 我现在想做的是构建 Au
  • 如何加载libandroid_runtime

    我正在开发一个项目 该项目被编译成 JAR 然后使用 javaws 进行部署 在我的一门课程中 我需要加载设备上目录 system lib 中找到的 libandroid runtime so 我该怎么做呢 System load liba
  • 当 alpha =0 时画布会损坏 RGB

    我正在使用 HTML 画布来投影图像 当我尝试操纵图像数据的 Alpha 通道时 我发现只要将其归零 像素中的其他值就会发生变化 即使设置为较低的数字 它们似乎也会发生变化 从控制台执行此操作 canvas document getElem
  • CXF BusException 命名空间没有 DestinationFactory http://cxf.apache.org/transports/http

    我正在尝试支持 basic cxf rs example 1 但使用我自己的服务impl这更简单 我的所有方法都返回字符串 当我尝试运行该服务器时 出现此异常 我建立了一个干净的项目 所以我要重新开始 大师 pom http maven a
  • StemDocument R 文本挖掘

    我的数据是一个txt文件 如下所示 字数 doc概述1客户1 store 1 marge 1 price 2 stock 2经济学2 文档的编号已排序 从最小到最大 现在我想要每个文档属于该文档的所有单词 现在它们站在一列中 但我想要文本文
  • 我应该使用一个大的 SQL Select 语句还是几个小的 SQL Select 语句?

    我正在使用从 MySQL 发送的数据构建一个 PHP 页面 是不是更好有 1 SELECT具有 4 个表连接的查询 或者 4 small SELECT没有表连接的查询 我确实从 ID 中选择 哪种方法更快 每种方法的优缺点是什么 我只需要每
  • 导入二维数据的 Python 和内存高效方法

    我正在尝试运行一些使用 Python 分析数据的脚本 我很快就对它占用的 RAM 空间感到惊讶 我的脚本从文件中读取两列整数 它通过以下方式导入它 import numpy as N from sys import argv infile
  • Antd - 有没有办法改变卡片标题的背景颜色?

    通过添加 style 属性 我只能更改 Card 组件主体部分的颜色 我怎样才能更改标题部分
  • 我是否需要内存屏障来访问已完成的线程修改的内存?

    以下为 C 术语 我有一个线程 A 和线程 B 共享对整数值 P 的访问 线程 A 初始化该值并在运行时更新它 然后线程A完成 线程 B 等待线程 A 完成 标准操作系统 API 调用 无论使用什么操作系统 并想要读取 P 线程 B 是否需