多线程环境下初始化的内存语义(C++)
Memory semantics of initialization in multithread environment (C++)
我不确定 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,可能无法观察到初始化写入。
我们是否需要用于初始化的内存栅栏才能被稍后发布的线程 运行 在不同的 cpu 上观察到?
在执行线程构造函数之前,父级中的操作与子级中的线程过程 运行 之间存在 "happens-before" 关系。特别是标准说(f
是线程过程):
Synchronization: The completion of the invocation of the constructor synchronizes with the beginning of the invocation of the copy of f
.
这可以在 [thread.thread.constr]
部分找到
我不确定 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,可能无法观察到初始化写入。
我们是否需要用于初始化的内存栅栏才能被稍后发布的线程 运行 在不同的 cpu 上观察到?
在执行线程构造函数之前,父级中的操作与子级中的线程过程 运行 之间存在 "happens-before" 关系。特别是标准说(f
是线程过程):
Synchronization: The completion of the invocation of the constructor synchronizes with the beginning of the invocation of the copy of
f
.
这可以在 [thread.thread.constr]