这样安全吗?或者我们需要取消注释“关键”的实用主义?
std::vector< std::vector<int> > vv(10);
#pragma omp parallel for
for (int i=0; i<10; ++i)
for (int j=0; j<100; ++j)
// Should we uncomment the following pragma?
// #pragma omp critical
vv[i].push_back(j);
给定的代码是安全的,因为所有线程都将在vv
的不同元素上运行。 std::vector
是弱线程安全的,因为你可以根据需要在不同的向量上同时操作。
简短的回答
简短的回答:不要退缩,没有关键部分是安全的
答案很长
不需要关键部分,因为echo线程被赋予for
循环的唯一迭代子集(您可以应用不同的策略来分发它们)。对你来说重要的是没有竞争条件,当在同一个向量上添加元素时(push_back
本身不是线程安全的)。
在你的情况下,每个线程总是只访问它自己的向量集,所以两个线程没有机会写相同的vector
。