如果检查了内存_order_relaxed,为什么要使用 memory_order_seq_cst 来设置停止标志?
在他的“原子武器”演示中,Herb Sutter 展示了原子变量的使用,包括场景涉及:
工作人员检查停止标志:
while (!stop.load(std::memory_order_relaxed)) { // Perform tasks }
Sutter 断言使用 memory_order_relaxed 检查标志是可以接受的,因为对线程停止延迟的影响最小。然而,使用 memory_order_seq_cst 来设置停止标志的原因仍不清楚。
分析:
mo_relaxed 足以加载和存储停止标志:
利用更强的内存并没有显着的延迟优势订单,即使观察 stop 或 keep_running 标志变化的延迟至关重要。
目前尚不清楚为什么 Sutter 建议不要放松商店运营。然而,ISO C 标准没有指定商店可见性时间或影响它的因素。仅强制实施以确保有限时间内的可见性。
线程间延迟和实施:
线程间延迟主要由实施决定。现实世界的 C 实现利用硬件缓存一致性机制,通常会导致存储可见性的低延迟(数十纳秒)。
seq_cst 和宽松的内存顺序都不会加速存储可见性;它们仅控制与存储或加载相关的后续操作的行为。更强的顺序不会加速事件,而是延迟其他操作,直到维持指定的顺序。
宽松的可见性和硬件缓存一致性:
在具有缓存一致性、内存的真实硬件上订单不能提高商店可见度的时机;它们仅管理后续操作在存储提交之前变得全局可见的能力。
停止标志的宽松内存顺序的好处:
宽松内存顺序的主要好处用于检查停止标志的是:
结论:
在这种情况下,memory_order_relaxed 适合加载并存储停止标志。 memory_order_seq_cst 对于增强存储可见性时序不是必需的。相反,它用于强制执行后续操作所需的顺序,并避免同时写入程序出现问题。
以上是为什么使用“memory_order_seq_cst”来设置通过“memory_order_relaxed”检查的停止标志?的详细内容。更多信息请关注PHP中文网其他相关文章!