我是否需要内存屏障来访问由完成的线程修改的内存?

时间:2017-03-29 19:08:41

标签: c++ multithreading synchronization barrier

[以下,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?"之前问过。我的直觉告诉我答案应该是一样的,但是......

1 个答案:

答案 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_variablestd::atomic_thread_fence(std::memory_order_acquire);