我想使用openMP来应用多线程。 这是我写的简单代码。
vector<Vector3f> a;
int i, j;
for (i = 0; i<10; i++)
{
Vector3f b;
#pragma omp parallel for private(j)
for (j = 0; j < 3; j++)
{
b[j] = j;
}
a.push_back(b);
}
for (i = 0; i < 10; i++)
{
cout << a[i] << endl;
}
我想把它改成效果:
parallel for1
{
for2
}
或
for1
{
parallel for2
}
删除#pragma行时代码有效。但是当我使用它时它不起作用。有什么问题?
/////////已添加
实际上我将OpenMP用于更复杂的例子, 双循环问题。
这里,当我不申请MP时,它运作良好。 但是当我申请时, 错误发生在矢量push_back行。
vector<Class> B;
for 1
{
#pragma omp parallel for private(j)
parallel for j
{
Class A;
B.push_back(A); // error!!!!!!!
}
}
如果我擦除B.push_back(A)行,当我应用MP时它也可以。
我找不到确切的错误消息,但它看起来像关于矢量的异常错误我猜。调试在
处停止void _Reallocate(size_type _Count)
{ // move to array of exactly _Count elements
pointer _Ptr = this->_Getal().allocate(_Count);
_TRY_BEGIN
_Umove(this->_Myfirst, this->_Mylast, _Ptr);
答案 0 :(得分:1)
std::vector::push_back
不是线程安全的,如果没有针对来自多个线程的竞争条件的任何保护,你就无法调用它。
相反,准备向量使其大小已经正确,然后通过operator[]
插入元素。
或者,您可以使用关键区域保护插入:
#pragma omp critical
B.push_back(A);
这样一次只有一个线程会进行插入,这将修复错误但会减慢代码。
总的来说,我认为你没有采用正确的方式进行并行化,但如果没有更清晰,更具代表性的问题描述,就没有办法提供更好的建议。