OpenMP和不同的STL向量

问题描述 投票:0回答:2

这样安全吗?或者我们需要取消注释“关键”的实用主义?

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);
c++ stl openmp
2个回答
0
投票

给定的代码是安全的,因为所有线程都将在vv的不同元素上运行。 std::vector是弱线程安全的,因为你可以根据需要在不同的向量上同时操作。


0
投票

简短的回答

简短的回答:不要退缩,没有关键部分是安全的

答案很长

不需要关键部分,因为echo线程被赋予for循环的唯一迭代子集(您可以应用不同的策略来分发它们)。对你来说重要的是没有竞争条件,当在同一个向量上添加元素时(push_back本身不是线程安全的)。

在你的情况下,每个线程总是只访问它自己的向量集,所以两个线程没有机会写相同的vector

© www.soinside.com 2019 - 2024. All rights reserved.