0

我不确定 C++ 初始化过程的内存语义。假设我们有以下程序。

#include <iostream>
#include <thread>

using namespace std;

void func(int* arr, int s)
{
    for (int i = 0; i < s; ++i)
    {
        cout << arr[i] << endl;
    }
}

int main(int argc, char *argv[])
{
    int *a = new int[10];
    for (int i = 0; i < 10; ++i)
    {
        a[i] = i;
    }

    // Do I need some sort of memory barrier here?
    std::thread t(func, a, 10);
    t.join();
    return 0;
}

新线程会看到正确初始化的数组吗?或者我是否需要在两者之间插入某种内存屏障。C++ 语言如何定义初始化的内存语义?

我担心的是对数组a[10] 的所有写入都可能位于一个 cpu 的写入缓冲区中,并且我们在不同的 cpu 上启动一个新线程,这可能不会观察到初始化写入。

我们是否需要用于初始化的内存栅栏才能被稍后在不同 CPU 上运行的线程观察到?

4

1 回答 1

1

在执行线程构造函数之前,父进程中的操作与子进程中运行的线程过程之间存在“之前发生”的关系。特别是标准说(f作为线程程序):

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

这可以在部分中找到[thread.thread.constr]

于 2017-07-21T01:33:45.367 回答