使用轻松的原子布尔值同步两个线程

时间:2018-12-12 10:22:50

标签: c++ multithreading atomic relaxed-atomics

我和一些同事正在讨论用于同步两个线程的宽松原子布尔值。我们已经进行了一些在线研究,发现了其他有关弛豫原子的示例和摘要,但我们无法从适用于本示例的结论中得出任何结论。

以下两个原子布尔在两个线程之间共享。

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使我们相信,负载毕竟将承担修改的任务。

1 个答案:

答案 0 :(得分:2)

线程1将在有限的时间后退出循环,这是[basic.exec]/18语言的要求:

  

实现应确保原子或同步操作分配的最后一个值(按修改顺序)将在有限的时间内对所有其他线程可见。

N.B .:如果线程2将false存储在原子中,则线程1可能永远看不到原子的状态true

N.B.2:我刚刚落入了您的问题的标题使用宽松的原子来同步线程