首页  >  文章  >  后端开发  >  为什么使用“memory_order_seq_cst”来设置通过“memory_order_relaxed”检查的停止标志?

为什么使用“memory_order_seq_cst”来设置通过“memory_order_relaxed”检查的停止标志?

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-11-15 03:10:02954浏览

Why Use `memory_order_seq_cst` for Setting a Stop Flag Checked with `memory_order_relaxed`?

如果检查了内存_order_relaxed,为什么要使用 memory_order_seq_cst 来设置停止标志?

在他的“原子武器”演示中,Herb Sutter 展示了原子变量的使用,包括场景涉及:

  • 主线程生成工作线程
  • 工作人员检查停止标志:

    while (!stop.load(std::memory_order_relaxed))
    {
      // Perform tasks
    }
  • 主线程最终将 stop 设置为 true使用 memory_order_seq_cst。

Sutter 断言使用 memory_order_relaxed 检查标志是可以接受的,因为对线程停止延迟的影响最小。然而,使用 memory_order_seq_cst 来设置停止标志的原因仍不清楚。

分析:

mo_relaxed 足以加载和存储停止标志:

利用更强的内存并没有显着的延迟优势订单,即使观察 stop 或 keep_running 标志变化的延迟至关重要。

目前尚不清楚为什么 Sutter 建议不要放松商店运营。然而,ISO C 标准没有指定商店可见性时间或影响它的因素。仅强制实施以确保有限时间内的可见性。

线程间延迟和实施:

线程间延迟主要由实施决定。现实世界的 C 实现利用硬件缓存一致性机制,通常会导致存储可见性的低延迟(数十纳秒)。

seq_cst 和宽松的内存顺序都不会加速存储可见性;它们仅控制与存储或加载相关的后续操作的行为。更强的顺序不会加速事件,而是延迟其他操作,直到维持指定的顺序。

宽松的可见性和硬件缓存一致性:

在具有缓存一致性、内存的真实硬件上订单不能提高商店可见度的时机;它们仅管理后续操作在存储提交之前变得全局可见的能力。

停止标志的宽松内存顺序的好处:

宽松内存顺序的主要好处用于检查停止标志的是:

  • 当加载结果为false。
  • 避免不必要的指令执行,尤其是在 acquire 或 seq_cst 加载需要额外指令的 ISA 上(例如 ARMv7 dmb ish)。

结论:

在这种情况下,memory_order_relaxed 适合加载并存储停止标志。 memory_order_seq_cst 对于增强存储可见性时序不是必需的。相反,它用于强制执行后续操作所需的顺序,并避免同时写入程序出现问题。

以上是为什么使用“memory_order_seq_cst”来设置通过“memory_order_relaxed”检查的停止标志?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn