假设我有一个线程A写入一个atomic_int x = 0;
, using x.store(1, std::memory_order_relaxed);
。如果没有任何其他同步方法,其他线程需要多长时间才能看到这一点,使用x.load(std::memory_order_relaxed);
?是否有可能写入的值x
考虑到标准给出的 C/C++ 内存模型的当前定义,是否完全保持线程本地化?
我手头的实际案例是一个线程B读到atomic_bool
经常检查是否必须退出;另一个线程在某个时刻写道true到这个 bool,然后在线程 B 上调用 join() 。显然,我不介意在线程 B 甚至可以看到atomic_bool 已设置之前调用 join() ,也不介意线程 B 之前已经看到更改并退出执行我调用 join()。但我想知道:使用memory_order_relaxed
在两侧,是否可以调用 join() 并“永远”阻塞,因为更改永远不会传播到线程 B?
Edit
我联系了 Mark Batty(数学验证并随后修复 C++ 内存模型要求的大脑)。本来是关于其他事情的(结果是 cppmem 和他的论文中的一个已知错误;所以幸运的是我没有完全出丑,也借此机会向他询问了这个问题;他的回答是:
问:理论上,这样的存储[没有(任何后续)释放操作的内存_顺序_放宽]是否永远不会到达另一个线程?
标记:从理论上讲,是的,但我认为尚未观察到这一点。
问:换句话说,宽松的商店没有意义吗?
无论如何,除非您将它们与某些释放操作结合起来(并且
在另一个线程上获取),假设您希望另一个线程
看见?
标记:是的,几乎所有的用例都使用释放和获取。
这就是标准对此事的全部规定,我相信:
[多线程简介]/25实现应确保原子或同步操作分配的最后一个值(按修改顺序)将在有限的时间内对所有其他线程可见。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)