[以下,C ++术语]
我有一个线程A和线程B共享访问整数值P.线程A初始化此值并在运行时更新它。然后线程A完成。线程B等待线程A完成(标准OS API调用,无论使用何种操作系统)并且想要读取P.
线程B是否需要一个内存屏障来读取一个连贯的,最后一个由线程A设置,P的值?是否有可能当OS API说"线程A完成"时,其修改的内存更改对其他线程不可见?
请注意,只有一个线程在此处写入值,这可能会或可能不会将此问题与" Is there an implicit memory barrier with synchronized-with relationship on thread::join?"之前问过。我的直觉告诉我答案应该是一样的,但是......
答案 0 :(得分:1)
join
与调用join
的线程同步。也就是说,当A
调用B
时,B
所做的所有写操作都会显示A.join()
。
您可以将此视为A
执行std::atomic_thread_fence(memory_order_release)
完成,B
执行std::atomic_thread_fence(std::memory_order_acquire
A
加入。
线程B是否需要内存屏障
是的,但它们隐含在join
中,您无需编写它们。
当OS API说“线程A完成”时,是否有可能其修改的内存更改对其他线程不可见?
join
来电者以外的线程需要额外的同步,例如std::condition_variable
或std::atomic_thread_fence(std::memory_order_acquire);