静态变量thread_local与open_MP

时间:2017-09-04 12:31:18

标签: c++ static openmp thread-local

我尝试使用open_MP并使用omp prallel,但我遇到了一个问题。

我使用了很多不同的静态类成员,比如

class A {
public:
    static std::vector<double> v;
}

我在.cpp文件中使用空向量初始化。

一段时间后,我做了一些计算,最后用我的初始值填充向量v:

A::v = {1,2,3};

一段时间后,我有一个大的for循环,可以(但不能)再次改变v的值。

现在我尝试使用open_MP来加快速度:

#pragma omp parallel for
for (int i = 0; i < nsched; ++i) {
    ...
}

因为我希望每个循环都有自己的静态向量实例,我只是试图让它成为thread_local。

class A {
public:
    static thread_local std::vector<double> v;
}

现在我的问题是,当我进入并行for循环时,我的向量v不再是{1,2,3},它只是空的。

我该怎么改变?我假设在开始时v是“主线程”的线程本地,而新创建的“子线程”不获取有关v的信息。 有没有办法轻松解决这个问题?或者我是否需要为每个线程初始化v? (这不会很好,因为初始化需要相当长的时间,而且不太可能(但可能)我需要更改每个for循环中的参数)

1 个答案:

答案 0 :(得分:1)

如果你写了初始化

thread_local std::vector<double> A::v {1,2,3};

您将在所有主题中获得包含v的{​​{1}}副本。但是如果你写了作业

{1,2,3}
你不会。 A::v = {1,2,3}; 将为每个线程重新初始化,而不是从任何其他线程复制。

如果需要初始化为某组值的数组的线程本地副本,则必须确保在每个线程中执行将值放在其中的操作(初始化或赋值)。