This question already has an answer here:
Does the C++11 memory model allow hoisting relaxed atomic loads out of loops?
(1 个回答)
2年前关闭。
我和一些同事正在讨论用于同步两个线程的宽松原子 bool 值。我们做了一些在线研究,发现了其他处理松弛原子的样本和片段,但我们未能从适用于我们的示例的那些中得出任何结论。
以下原子 bool 值在两个线程之间共享。
第一个线程进入一个循环,只有在设置了原子 bool 值后才退出。请注意,每个循环迭代的负载都被标记为松弛的。
在第一个线程进入循环后的某个时刻(由其他一些同步机制保证),第二个线程执行以下语句。再次请注意,这里的商店标记为休闲。
问题: 从纯理论的角度来看,是保证第一个退出循环的线程;为什么?
就我们认为理解宽松原子而言,我们认为加载操作并不能保证看到写操作的修改。但是其他 online examples concerning thread-safe counters 让我们相信负载终究会接受修改......
(1 个回答)
2年前关闭。
我和一些同事正在讨论用于同步两个线程的宽松原子 bool 值。我们做了一些在线研究,发现了其他处理松弛原子的样本和片段,但我们未能从适用于我们的示例的那些中得出任何结论。
以下原子 bool 值在两个线程之间共享。
std::atomic_bool stopping{false};
第一个线程进入一个循环,只有在设置了原子 bool 值后才退出。请注意,每个循环迭代的负载都被标记为松弛的。
// 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 将在有限时间后退出循环,这是 [basic.exec]/18 语言的要求:
注意:如果线程 2,后者将 false
存储在原子中,线程 1 可能永远不会看到原子的状态 true
。
N.B.2:我刚刚使用放松原子来同步线程的问题的标题:这是不可能的。
关于c++ - 使用宽松的原子 bool 值同步两个线程,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53740862/