平行推回向量的向量

时间:2019-07-11 06:53:31

标签: c++ thread-safety openmp

我有一个向量vector。我以并行方式构造此向量,其中向量中的每个索引由单个线程处理。与此类似:

vector<vector<int> > global_vec(10, vector<int>({}));

#pragma omp parallel for schedule(dynamic)
for(int i = 0; i < 10; i++)
{
    for(int j = 0; j < i * 5; j++)
    {
        global_vec[i].push_back(i);
    }
}

我知道如果我事先知道每个向量的大小,那么我可以在开始时分配所需的大小,那么就没有问题了。但这不是我能做的,我需要动态地后退。这个线程安全吗?

谢谢。

1 个答案:

答案 0 :(得分:5)

是的,这是线程安全的,因为内部向量仅由一个线程修改。您可以省略schedule(dynamic)派生词,仍然保存。

如果您使用std::iota摆脱了内循环,这将变得更加清晰。

vector<vector<int> > global_vec(10, vector<int>({}));

#pragma omp parallel for schedule(dynamic)
for(int i = 0; i < 10; i++)
{
    global_vec[i].resize(i * 5) ;
    std::iota(global_vec[i].begin(), global_vec[i].end(), 0);
}

Ps。如果外部向量的大小固定,请考虑使用std::array<vector<int>, 10>