首页 > 解决方案 > 平行推回向量的向量

问题描述

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

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);
    }
}

我知道如果我事先知道每个向量的大小,我可以在开始时分配所需的大小,然后就不会有问题了。但这不能由我完成,我需要动态推回。这个线程安全吗?

提前致谢。

标签: c++thread-safetyopenmp

解决方案


是的,这是线程安全的,因为内部向量仅由一个线程修改。您可以省略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);
}

附言。如果您的外部向量具有固定大小,请考虑使用 astd::array<vector<int>, 10>代替。


推荐阅读