我和一些同事正在讨论用于同步两个线程的宽松原子布尔值。我们已经进行了一些在线研究,发现了其他有关弛豫原子的示例和摘要,但我们无法从适用于本示例的结论中得出任何结论。
以下两个原子布尔在两个线程之间共享。
std::atomic_bool stopping{false};
第一个线程进入循环,仅在设置了原子布尔值后退出。请注意,每次循环迭代的负载都标记为“宽松”。
// Thread 1
while (!stopping.load(std::memory_order_relaxed))
{
// ...
}
在第一个线程进入循环之后(由某些其他同步机制保证),第二个线程将执行以下语句。再次注意,这里的商店被标记为轻松。
// Thread 2
stopping.store(true, std::memory_order_relaxed);
问题:从纯粹的理论角度来看,是第一个保证退出循环的线程;为什么?
就我们认为理解松弛原子而言,我们认为不能保证装入操作会看到写操作的修改。但是其他online examples concerning thread-safe counters使我们相信,负载毕竟将承担修改的任务。
答案 0 :(得分:2)
线程1将在有限的时间后退出循环,这是[basic.exec]/18语言的要求:
实现应确保原子或同步操作分配的最后一个值(按修改顺序)将在有限的时间内对所有其他线程可见。
N.B .:如果线程2将false
存储在原子中,则线程1可能永远看不到原子的状态true
。
N.B.2:我刚刚落入了您的问题的标题使用宽松的原子来同步线程: