首页  >  文章  >  后端开发  >  如果使用 memory_order_relaxed 检查它,为什么要使用 memory_order_seq_cst 设置停止标志?

如果使用 memory_order_relaxed 检查它,为什么要使用 memory_order_seq_cst 设置停止标志?

DDD
DDD原创
2024-11-11 15:22:03561浏览

Why set the stop flag using memory_order_seq_cst, if you check it with memory_order_relaxed?

如果使用 memory_order_relaxed 检查它,为什么要使用 memory_order_seq_cst 设置停止标志?

在视频中,Herb Sutter 讨论了使用原子,包括主线程启动工作线程的示例。工作人员检查停止标志,主线程最终使用 memory_order_seq_cst 将停止标志设置为 true。 Sutter 解释说,使用 memory_order_relaxed 检查标志是可以接受的,因为停止线程的延迟并不显着。

问题在于为什么使用 memory_order_seq_cst 而不是 memory_order_relaxed 设置停止标志。

mo_relaxed 对于停止的加载和存储都很好flag

在这种情况下,更强的内存顺序没有任何有意义的延迟优势,即使看到 stop 或 keep_running 标志更改的延迟很重要。

ISO C 标准没有指定商店变得可见的速度或可能影响它的因素。它只要求实现确保原子或同步操作分配的最后一个值在有限的时间内对所有其他线程可见。

线程间延迟主要是一个实现质量问题,标准让事情变得开放。普通 C 实现通常针对某些架构编译为 asm,并公开硬件的缓存一致性属性,从而降低线程间延迟。

在使用缓存一致性的实际硬件上,存储或加载的不同内存顺序不会发生变化。让商店更快地实时可见。它们控制在等待存储从存储缓冲区提交到 L1d 缓存时后续操作是否可以全局可见。

更强的命令和障碍,绝对不会让事情发生得更快。它们会延迟其他事情,直到允许与存储或加载相关的事情发生。

使用 memory_order_relaxed 进行加载的性能优势

使用 memory_order_relaxed 进行加载具有以下性能优势:

  • 避免不必要的等待为了完成检查,当加载产生错误时,允许跨循环迭代更多的指令级和内存级并行性。
  • 避免 ISA 上的额外指令,其中获取或 SC 加载需要额外的指令,例如 2某些架构上的-way屏障指令。

在这种特定场景中,很少设置停止标志,由于错误加载而浪费的工作是最小的。因此,使用 memory_order_relaxed 的性能优势超过了潜在的缺点。

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

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