并行推回矢量的矢量

Parallel push back to a vector of vector

本文关键字:并行      更新时间:2023-10-16

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

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

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

提前谢谢。

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

附言。如果外部向量具有固定大小,请考虑改用std::array<vector<int>, 10>