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

jwd*_*jwd 23 c++ multithreading

我想大致这样做:

初始线程:

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

其他线程:

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

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

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

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

旁白:我想我可以添加一些虚拟的东西std::atomic<int>,并在启动其他线程之前写入,然后在其他线程上,在启动时读取一次。我相信所有的happens-before 机制都可以保证先前编写的全局状态是正确可见的。

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

Nat*_*ica 27

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

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

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