带有memory_order_relaxed的商店是否可能永远不会到达其他线程?

Car*_*ood 7 c++ memory-barriers c++11 relaxed-atomics

假设我有一个写入a的线程Aatomic_int x = 0;,使用x.store(1, std::memory_order_relaxed);.没有任何其他同步方法,在其他线程看到这个之前需要多长时间,使用x.load(std::memory_order_relaxed);x根据标准给出的C/C++内存模型的当前定义,写入的值是否可能完全保持线程局部?

我手边的实际案例是线程Batomic_bool频繁读取以检查是否必须退出的情况; 另一个线程,在某些时候,写入true给这个bool,然后调用线程B上的join().显然我不介意在线程B甚至可以看到atomic_bool被设置之前调用join(),我也不介意线程在调用join()之前,B已经看到了更改并退出了执行.但我想知道:memory_order_relaxed在双方使用,是否可以调用join()并阻止"永远",因为更改永远不会传播到线程B?

编辑

我联系了Mark Ba​​tty(数学验证并随后修复C++内存模型要求的大脑).最初是关于别的东西(原来是cppmem和他的论文中的一个已知的错误;幸运的是我没有完全愚弄自己,并借此机会向他询问这个问题;他的回答是:

问:从理论上讲,这样的商店[memory_order_relaxed没有(任何跟随)释放操作]永远不会到达另一个线程吗?
马克:从理论上讲,是的,但我认为没有观察到这一点.
问:换句话说,松散的商店没有任何意义,除非你将它们与一些发布操作结合(并在另一个线程上获取),假设你想要另一个线程看到它?
Mark:几乎所有的用例都使用release和acquire,是的.

Igo*_*nik 9

这就是标准对此事的全部看法,我相信:

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


LWi*_*sey -2

标准 29.3.12 中是这样规定的:

实现应该使原子存储在合理的时间内对原子加载可见。

不能保证 astore在另一个线程中变得可见,没有保证时间,并且与内存顺序没有正式关系。

当然,在每个常规架构上 astore 变得可见,但在不支持缓存一致性的罕见平台上,它可能永远不会对 a 可见load
在这种情况下,您必须进行原子读取-修改-写入操作才能获取修改顺序中的最新值。

  • 由于合理的时间肯定排除无限时间,因此这条规则是否不能保证商店在另一个线程中变得可见? (2认同)