这样安全吗?或者我们需要取消对“关键”实用程序的注释?
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);
答案 0 :(得分:0)
给定的代码是安全的,因为所有线程将在vv
的不同元素上运行。 std::vector
的线程安全性很弱,因为您可以根据需要同时对不同的向量进行操作。
答案 1 :(得分:0)
简短答案
简短的回答:不要取消注释,没有关键部分是安全的
长期回答
不需要关键部分,因为回声线程从RUN localedef -v -c -i en_US -f UTF-8 en_US; exit 0
RUN sed -i 's/en_US.UTF-8/en_US/g' /etc/sysconfig/i18n && source /etc/sysconfig/i18n
循环中获得了唯一的迭代子集(可以应用各种不同的策略来分配它们)。
对您而言重要的是,不会在同时向同一向量添加元素时发生竞争条件(for
本身不是线程安全的。)
在您的情况下,每个线程始终且仅访问其自己的向量集,因此,两个线程不可能写相同的push_back
。