Параллельный толчок обратно к вектору вектора - PullRequest
4 голосов
/ 11 июля 2019

У меня есть вектор вектора.Я строю этот вектор параллельно с каждым индексом в векторе, который обрабатывается одним потоком.Что-то похожее на это:

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 Ответ

5 голосов
/ 11 июля 2019

Да, это потокобезопасный, поскольку внутренние векторы модифицируются только одним потоком.Вы можете опустить производную 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>.

...