4

我和一些同事正在讨论用于同步两个线程的宽松原子布尔值。我们已经进行了一些在线研究,并发现了其他处理宽松原子的示例和片段,但我们未能从适用于我们示例的那些中得出任何结论。

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

std::atomic_bool stopping{false};

第一个线程进入一个循环,并且只有在设置了原子布尔值后才退出。请注意,每次循环迭代的负载都标记为松弛。

// Thread 1
while (!stopping.load(std::memory_order_relaxed))
{
    // ...
}

在第一个线程进入循环后的某个时刻(由其他一些同步机制保证),第二个线程执行以下语句。再次注意,这里的商店被标记为放松。

// Thread 2
stopping.store(true, std::memory_order_relaxed);

问题:从纯理论的角度来看,是否保证第一个线程退出循环;为什么?


就我们认为理解宽松原子而言,我们认为加载操作并不能保证看到写入操作的修改。但是其他有关线程安全计数器的在线示例使我们相信负载毕竟会接受修改......

4

1 回答 1

3

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

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

注意:如果线程 2,后者存储false在原子中,线程 1 可能永远看不到true原子的状态。

NB2:我刚刚使用轻松的原子来同步线程的问题的标题:这是不可能的。

于 2018-12-12T11:13:45.753 回答