[以下为 C++ 术语]
我有一个线程 A 和线程 B 共享对整数值 P 的访问。线程 A 初始化该值并在运行时更新它。然后线程A完成。线程 B 等待线程 A 完成(标准操作系统 API 调用,无论使用什么操作系统)并想要读取 P。
线程 B 是否需要内存屏障来读取线程 A 最后设置的连贯 P 值?是否有可能当操作系统API说“线程A完成”时,它修改的内存更改对其他线程还不可见?
请注意,有only one线程在此处写入值,这可能会也可能不会将此问题与“thread::join 上是否存在具有同步关系的隐式内存屏障? https://stackoverflow.com/questions/42175207/is-there-an-implicit-memory-barrier-with-synchronized-with-relationship-on-threa”之前问过。我的直觉告诉我答案应该是一样的,但是......
join
与调用的线程同步join
。也就是说,所有的写A
使得将变得可见B
when B
calls A.join()
.
你可以将其视为A
执行std::atomic_thread_fence(memory_order_release)
当它完成时B
执行std::atomic_thread_fence(std::memory_order_acquire
as A
joins.
线程B是否需要内存屏障
是的,但它们隐含在join
而且你不必写它们。
是否有可能当操作系统API说“线程A完成”时,它修改的内存更改对其他线程还不可见?
调用者以外的线程join
将需要额外的同步,例如std::condition_variable
or std::atomic_thread_fence(std::memory_order_acquire);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)