多线程环境中初始化的内存语义(C ++)

时间:2017-07-20 02:09:17

标签: c++ multithreading concurrency memory-fences

我不确定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上的线程中观察到?

1 个答案:

答案 0 :(得分:1)

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

  

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

这可以在[thread.thread.constr]

部分找到