我和一些同事正在讨论用于同步两个线程的宽松原子布尔值。我们已经进行了一些在线研究,并发现了其他处理宽松原子的示例和片段,但我们未能从适用于我们示例的那些中得出任何结论。
以下原子布尔值在两个线程之间共享。
std::atomic_bool stopping{false};
第一个线程进入一个循环,并且只有在设置了原子布尔值后才退出。请注意,每次循环迭代的负载都标记为松弛。
// Thread 1
while (!stopping.load(std::memory_order_relaxed))
{
// ...
}
在第一个线程进入循环后的某个时刻(由其他一些同步机制保证),第二个线程执行以下语句。再次注意,这里的商店被标记为放松。
// Thread 2
stopping.store(true, std::memory_order_relaxed);
问题:从纯理论的角度来看,是否保证第一个线程退出循环;为什么?
就我们认为理解宽松原子而言,我们认为加载操作并不能保证看到写入操作的修改。但是其他有关线程安全计数器的在线示例使我们相信负载毕竟会接受修改......