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

标签 c++ multithreading

我想大致这样做:

初始线程:

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

  • 其他线程:
  • 读取全局状态
  • 做工作,等等。

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

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

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

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

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

    最佳答案

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

    Synchronization: The completion of the invocation of the constructor synchronizes with the beginning of the invocation of the copy of f.



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

    关于c++ - 产生线程是否自己提供内存顺序保证?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60423427/

    相关文章:

    具有碎片字段和 uint 别名的 C++ 位字段

    c# - 为什么我们不能更改 ThreadPool 线程的单元状态,为什么我们在使用 ShowDialog 时不需要消息泵?

    c# - 线程通知另一个线程异常

    multithreading - 如何将对堆栈变量的引用传递给线程?

    c++ - C++中类的隐式成员函数

    c++ - 无法让 argv 传递给字符串

    java - 在 Java 中 : how can i terminate execution of all threads without waiting for them to finish their jobs using ExecutorService?

    Java - 停止具有共享对象的线程

    c++ - 调用x64汇编函数后C++变量重置为0

    每个线程仅使用一个索引的结构线程安全的 C++ 成员数组?