释放-获取的传递性

2023-11-22

正当我以为我已经掌握了原子知识时,我看到了另一篇文章。这是摘录自GCC wiki, under 总体总结:

 -Thread 1-       -Thread 2-                   -Thread 3-
 y.store (20);    if (x.load() == 10) {        if (y.load() == 10)
 x.store (10);      assert (y.load() == 20)      assert (x.load() == 10)
                    y.store (10)
                  }

释放/获取模式只需要所涉及的两个线程同步。这意味着同步值与其他线程不可交换。线程 2 中的断言仍然必须为 true,因为线程 1 和 2 与 x.load() 同步。线程 3 不参与此同步,因此当线程 2 和 3 使用 y.load() 同步时,线程 3 的断言可能会失败。线程 1 和 3 之间没有同步,因此不能为“x”假设任何值。

文章说线程 2 中的断言不会失败,但是线程 3 中的断言不会失败might.

我觉得这很令人惊讶。这是我的推理链,线程 3 断言不会失败——也许有人可以告诉我哪里错了。

  1. 线程 3 观察y == 10仅当线程 2 写入 10 时。
  2. 仅当线程 2 看到时才写入 10x == 10.
  3. 线程 2(或any线程)看到x == 10仅当线程 1 写入 10 时。任何线程都没有对 x 进行进一步更新。
  4. 由于线程 2 观察到x == 10,线程 3 也与线程 2 同步,应该观察x == 10.

释放/获取模式只需要所涉及的两个线程同步。

有人可以指出这个仅限两方的要求的来源吗?我的理解(当然,也许是错误的)是生产者不知道它正在与谁同步。即,线程 1 不能说“我的更新仅适用于线程 2”。同样,线程 2 不能说“给我线程 1 的更新”。相反,发布了x = 10线程 1 可供任何人观察,如果他们愿意的话。

Thus, x = 10作为最后一次更新(由线程 1),任何从系统中任何地方发生的获取(通过传递同步确保)都保证观察到该写入,不是吗?

这意味着同步值与其他线程不可交换。

不管这是否属实,作者的意思可能是及物的, not 可交换的, right?

最后,如果我上面错了,我很想知道什么同步操作可以保证线程 3 的断言不会失败。


看来您在 GCC wiki 中发现了一个错误。
T3 中的断言在 C++ 中不应失败。
以下是 C++20 标准中相关引用的解释:

  1. x.store (10) in T1 happens before assert (x.load() == 10) in T3, because:
    • 每个线程中的语句都按以下顺序排序之前测序

    9 Every value computation and side effect associated with a full-expression is sequenced before every value computation and side effect associated with the next full-expression to be evaluated.48

    • x.store (10) 与同步 if (x.load() == 10) and y.store (10) 与同步 if (y.load() == 10)

    2 An atomic operation A that performs a release operation on an atomic object M synchronizes with an atomic operation B that performs an acquire operation on M and takes its value from any side effect in the release sequence headed by A.

    • 因此x.store (10) 线程间发生在之前 assert (x.load() == 10)

    9 An evaluation A inter-thread happens before an evaluation B if
    (9.1)   — A synchronizes with B, or
    (9.2)   — A is dependency-ordered before B, or
    (9.3)   — for some evaluation X
    (9.3.1)    — A synchronizes with X and X is sequenced before B, or
    (9.3.2)    — A is sequenced before X and X inter-thread happens before B, or
    (9.3.3)    — A inter-thread happens before X and X inter-thread happens before B.

    • 这也意味着x.store (10) 发生在之前 assert (x.load() == 10)

    10 An evaluation A happens before an evaluation B (or, equivalently, B happens after A) if:
    (10.1)   — A is sequenced before B, or
    (10.2)   — A inter-thread happens before B.

  2. the above means that x.load() in assert (x.load() == 10) must return 10 written by x.store (10).
    (We assume here that x was published correctly and therefore the initial value of x comes before x.store (10) in the modification order of x).

    18 If a side effect X on an atomic object M happens before a value computation B of M, then the evaluation B shall take its value from X or from a side effect Y that follows X in the modification order of M.
    [Note 18: This requirement is known as write-read coherence. — end note]

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

释放-获取的传递性 的相关文章

随机推荐

  • Java 的接口优势

    我的问题很简单 如果接口由单个类实现 那么使用接口有什么优势吗 我一直认为只有当接口有多个实现时 接口才是好的 Thanks 一句话 不 接口所表示的契约可以直接在您唯一的类中指定 如果您清楚将来不需要相同方法的另一个实现 则可以避免定义接
  • 选择框选项上的工具提示

    我有一个选择框 其中选项具有策略名称 我需要在选项的工具提示中显示策略的描述 我尝试了tipr插件 其中使用了data tip选项 它适用于 div span 等 但不适用于选择框选项 我还尝试了上面链接中附加的正常方法 仅当下拉列表默认打
  • .NET 5 GRPC 客户端调用引发异常:在未启用 HTTP/2 的情况下使用版本策略 RequestVersionOrHigher 请求 HTTP 版本 2.0

    这是我的第一个 gRPC 应用程序 我尝试从 NET 5 gRPC 客户端 Grpc Net Client 2 35 0 调用服务器流式 RPC 调用 这会在我的本地开发环境中导致以下异常 Grpc Core RpcException 状态
  • 如何在google v8(和nodejs)中渲染32位unicode字符

    有谁知道如何在谷歌v8 驱动谷歌浏览器和nodejs的javascript虚拟机 中渲染unicode 星体平面 字符 其CID超出0xffff 有趣的是 当我给google chrome 它标识为11 0 696 71 在ubuntu 1
  • 如何使用 FieldValue.serverTimestamp() 在 android 中自定义模型类

    我使用 Firestore 作为数据库 现在我想在用户注册时存储服务器时间戳 来自 Firestore 文档 Map
  • 使用 jquery 增加和减少输入值

    单击 和 按钮时我需要增加和减少输入的值 但它似乎不起作用 我从这篇文章中得到了代码 如何使用 jQuery 增加数量字段的值 单击添加按钮时 我插入了一条 console log 语句以进行调试 令人惊讶的是 即使我单击了 id 为 ad
  • 分布式作业调度、管理和报告

    我最近玩了Hadoop它对 MapReduce 作业的调度 管理和报告印象深刻 它似乎使新作业的分配和执行变得非常无缝 使开发人员能够专注于其作业的实施 我想知道Java领域中是否存在一些对于作业的分布式执行来说不容易表达为MapReduc
  • RandomNumber 方法每次调用都返回相同的数字

    每次从 for 循环中调用 RandomNumber 方法时 我都尝试生成不同的随机数 现在 它每次都返回相同的数字 这是我的 RandomNumber 方法 private int RandomNumber int min int max
  • 我如何模拟 java.time.LocalDate.now()

    在我的测试用例中 我需要测试时间敏感的方法 在该方法中我们使用 java 8 类 LocalDate 它是not Joda 当我运行测试时 我可以做什么来改变时间 在您的代码中 替换LocalDate now with LocalDate
  • 语音合成 API 在说出单词时突出显示单词

    目前 我正在制作一个简单的应用程序 其中使用语音合成 API 说出文本 我想突出显示正在说出的单词 粗体 我目前有一个非常基本的实现 使用 onboundary 事件来执行此操作 然而 我想知道是否有更好 更好的方法来做到这一点 因为我的实
  • 为什么这个图像在Java中按比例缩小后看起来这么糟糕?

    这是原始图像 http rank my public images uploaded orig 4193395691714613396 png 这里它被缩小到 300x225 http rank my public images uploa
  • 在 .NET/C# 中使用委托加速反射 API

    This post有评论if you need to call the method multiple times use reflection once to find it then assign it to a delegate an
  • URIBuilder 和列表查询参数

    我正在使用阿帕奇URI生成器构建一个查询字符串获取方法的休息服务 RequestMapping value remote public Return getTest Ordine ordine throws Exception 这是输入对象
  • Java重构工具[重复]

    这个问题在这里已经有答案了 可能的重复 像 ReSharper 这样的工具 但适用于 Java 我非常频繁地使用 Eclipse 提供的 Java 代码重构工具 提取接口 重命名方法等 有谁知道其他类似的工具 最好是 Eclipse 插件
  • 在实体框架中添加与同一个表的第二个一对一关系

    我正在做代码优先的实体框架设计 我有一个表 Account 它有一个属性 Supervisor public class Account public int Id get set public Account Supervisor get
  • 如何进入亚音速?

    一个月前 我搜索了一些可以为我的 SQL 数据库 表生成 C 类的工具 这样我就不必手动编写DAL类并节省大量时间 我遇到了 ORM 和亚音速 我在主页上观看了网络广播http subsonicproject com 并且是印象深刻 by
  • 在静默模式下运行 CMD 或 BAT

    如何以静默模式运行 CMD 或 bat 文件 我希望阻止向用户显示 CMD 界面 包括这句话 echo off 就在你的bat脚本的顶部
  • 如何在 Windows 8 应用程序中向 HttpWebRequest 添加标头?

    我开发 C XAML Metro ui 应用程序 我想调用一些服务并使用HttpWebRequest为了这 之前的实现HttpWebRequest包含ContentLength and UserAgent特性 但WinRT的实现却没有它 我
  • AES/CBC 真的需要 IV 参数吗?

    我正在编写一个简单的应用程序来使用 AES CBC 模式 加密我的消息 据我了解 CBC 模式需要 IV 参数 但我不知道为什么我的代码在不使用 IV 参数的情况下工作 任何人都可以解释为什么吗 谢谢 加密消息无一例外地打印 T9KdWxV
  • 释放-获取的传递性

    正当我以为我已经掌握了原子知识时 我看到了另一篇文章 这是摘录自GCC wiki under 总体总结 Thread 1 Thread 2 Thread 3 y store 20 if x load 10 if y load 10 x st