假设我有一个线程Aatomic_int x = 0;
使用x.store(1, std::memory_order_relaxed);
. 如果没有任何其他同步方法,其他线程需要多长时间才能看到这个,使用x.load(std::memory_order_relaxed);
?x
考虑到标准给出的 C/C++ 内存模型的当前定义,写入的值是否可能完全保持在线程本地?
我手头的实际情况是线程B经常读取 anatomic_bool
以检查它是否必须退出;在某个时候,另一个线程对该布尔值写入true,然后在线程 B 上调用 join()。显然,我不介意在线程 B 甚至可以看到 atomic_bool 已设置之前调用 join(),我也不介意线程何时在我调用 join() 之前,B 已经看到了更改并退出了执行。但我想知道:memory_order_relaxed
在双方都使用时,是否可以调用 join() 并“永远”阻塞,因为更改永远不会传播到线程 B?
编辑
我联系了 Mark Batty(数学验证并随后修复 C++ 内存模型要求的大脑)。最初是关于其他的(结果是 cppmem 和他的论文中的一个已知错误;所以幸运的是我没有完全自欺欺人,也借此机会向他询问了这个问题;他的回答是:
问:理论上这样的存储[memory_order_relaxed without (any following) release operation]是否永远不会到达其他线程?
马克:理论上,是的,但我认为没有观察到这一点。
问:换句话说,如果您希望另一个线程看到它,除非您将它们与一些释放操作(并在另一个线程上获取)结合起来,否则轻松存储是否毫无意义?
马克:几乎所有的用例都使用发布和获取,是的。