在视频中,Herb Sutter 讨论了使用原子,包括主线程启动工作线程的示例。工作人员检查停止标志,主线程最终使用 memory_order_seq_cst 将停止标志设置为 true。 Sutter 解释说,使用 memory_order_relaxed 检查标志是可以接受的,因为停止线程的延迟并不显着。
问题在于为什么使用 memory_order_seq_cst 而不是 memory_order_relaxed 设置停止标志。
在这种情况下,更强的内存顺序没有任何有意义的延迟优势,即使看到 stop 或 keep_running 标志更改的延迟很重要。
ISO C 标准没有指定商店变得可见的速度或可能影响它的因素。它只要求实现确保原子或同步操作分配的最后一个值在有限的时间内对所有其他线程可见。
线程间延迟主要是一个实现质量问题,标准让事情变得开放。普通 C 实现通常针对某些架构编译为 asm,并公开硬件的缓存一致性属性,从而降低线程间延迟。
在使用缓存一致性的实际硬件上,存储或加载的不同内存顺序不会发生变化。让商店更快地实时可见。它们控制在等待存储从存储缓冲区提交到 L1d 缓存时后续操作是否可以全局可见。
更强的命令和障碍,绝对不会让事情发生得更快。它们会延迟其他事情,直到允许与存储或加载相关的事情发生。
使用 memory_order_relaxed 进行加载具有以下性能优势:
在这种特定场景中,很少设置停止标志,由于错误加载而浪费的工作是最小的。因此,使用 memory_order_relaxed 的性能优势超过了潜在的缺点。
以上是如果使用 memory_order_relaxed 检查它,为什么要使用 memory_order_seq_cst 设置停止标志?的详细内容。更多信息请关注PHP中文网其他相关文章!