gpt4 book ai didi

c++ - 具有 memory_order_relaxed 的存储是否有可能永远不会到达其他线程?

转载 作者:可可西里 更新时间:2023-11-01 18:36:40 30 4
gpt4 key购买 nike

假设我有一个线程 A 写入 atomic_int x = 0;,使用 x.store(1, std::memory_order_relaxed);。如果没有任何其他同步方法,使用 x.load(std::memory_order_relaxed); 其他线程需要多长时间才能看到这一点?鉴于标准给出的 C/C++ 内存模型的当前定义,写入 x 的值是否可能完全保持线程本地?

我手头的实际案例是线程 B 频繁读取 atomic_bool 以检查它是否必须退出;另一个线程,在某个时候,将 true 写入此 bool,然后在线程 B 上调用 join()。显然我不介意在线程 B 甚至可以看到 atomic_bool 已设置之前调用 join() ,我也不介意线程 B 在我调用 join() 之前已经看到更改并退出执行。但我想知道:在两侧使用 memory_order_relaxed,是否可以调用 join() 并“永远”阻塞,因为更改永远不会传播到线程 B?

编辑

我联系了 Mark Ba​​tty(数学验证和随后修复 C++ 内存模型要求的大脑)。最初是关于其他事情(后来证明是 cppmem 和他的论文中的一个已知错误;幸运的是我没有完全出洋相,并借此机会也问了他这件事;他的回答是:

Q: Can it theoretically be that such a store [memory_order_relaxed without (any following) release operation] never reaches the other thread?
Mark: Theoretically, yes, but I don't think that has been observed.
Q: In other words, do relaxed stores make no sense whatsoever unless you combine them with some release operation (and acquire on the other thread), assuming you want another thread to see it?
Mark: Nearly all of the use cases for them do use release and acquire, yes.

最佳答案

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

[intro.multithread]/25 An implementation should ensure that the last value (in modification order) assigned by an atomic or synchronization operation will become visible to all other threads in a finite period of time.

关于c++ - 具有 memory_order_relaxed 的存储是否有可能永远不会到达其他线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43749985/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com