产生线程是否自己提供内存顺序保证?


20

我想大致这样做:

初始线程:

  • 向全局变量写入一些值(它们将不再被写入)
    • 这可能是中等大小的数据(数组,字符串等)。无法简单地制造std::atomic<>
  • 产生其他线程

其他线程:

  • 读取全局状态
  • 做工作等

现在,我知道可以将参数传递给std::thread,但是我试图通过此示例理解C ++的内存保证。

另外,我非常有信心,在任何实际的实现中,创建线程都会造成内存障碍,从而确保线程可以“看到”父线程在此之前编写的所有内容。

但是我的问题是:这是否由标准保证?

另外:我想我可以添加一些虚拟对象std::atomic<int>,然后在启动其他线程之前写入该虚拟对象,然后在其他线程上,在启动时读取一次。我相信所有发生的事情都会确保之前编写的全局状态正确可见。

但是我的问题是,技术上是否需要类似的东西,或者线程创建是否足够?


我想我可以添加一些虚拟对象std::atomic<int>...可以使用std::atomic_thread_fence
Rin Kaenbyou

@NathanOliver d'oh。已删除评论。无论我的问题多么愚蠢,我都无法数出您在这里帮助过我的频率...
idclev 463035818

1
@ idclev463035818不用担心。它发生在我们所有人身上。
NathanOliver

Answers:


26

创建线程就足够了。每个[thread.thread.constr] / 7在线程构造函数和新线程的开始之间都有一个同步点。

同步:构造函数的调用完成与的副本的调用开始同步f

这意味着在生成新线程之前,线程中的所有状态对于生成的线程都是可见的。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.