我有一个向量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);
}
}
我知道如果我事先知道每个向量的大小,那么我可以在开始时分配所需的大小,那么就没有问题了。但这不是我能做的,我需要动态地后退。这个线程安全吗?
谢谢。
答案 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>
。