使用OpenMP for_each和BOOST_FOREACH时出现分段错误

时间:2015-09-27 14:49:52

标签: c++ multithreading boost openmp boost-bind

我在C ++中对for_each的并行版本进行了大量搜索。我发现以下一段代码与here中的for_each并列:

template<class T, class Function>
void parallel_for_each(std::vector< T> & obj, Function f)
{
  int size = obj.size();
  #pragma omp parallel for firstprivate(f) shared(obj)
  for (int i = 0; i < size; i++)
  {
    f(obj[i]);
  }
}

这是我的一段代码:

class A;
typedef std::vector <A> vec_A;
typedef std::vector <vec_A> vec_2D_A;
vec_2D_A a2d; 
...
//serial
BOOST_FOREACH(vec_A& av, a2d)
{
  for_each(av.begin(), av.end(), boost::bind(detect_Type, _1, CGAL, *this));
}
// parallel (segfault here!)
BOOST_FOREACH(vec_A& av, a2d)
{
  parallel_for_each(av, boost::bind(detect_Type, _1, ALL, *this));
}
...

A是一个特定点的类。每个成员都有一个与其坐标和其他成员变量相对应的变量。 函数detect_type正在修改av的成员。

vec_pnt内的所有成员彼此独立,但我仍然收到段错误。

修改

这里是更多代码段。 detect_type负责使用最近邻搜索和XfieldPlus类本身的帮助来查找A的每个对象的类型。

void detect_Type(A& PNT, const NNSerach NNType, const xFieldPlus& lst)
{
  switch (NNType)
  {
    case 0: 
    {
      Nvertex = ANN_nearest(tip, lst); // It is NOT thread safe.
    }
      break;
    case 1:
    {
      Nvertex = BOOST_nearest(tip, lst);
    }
      break;
    case 2:  //we use CGAL
    {
      Nvertex = CGAL_nearest(tip, lst);
    }
      break; 
    default:
      std::cout << "Unknown NN-Serach" << std::endl;
      break;
  }
  ....
  for(Entity::edgeIterator edgIter = f.beginEdge(); edgIter!= f.endEdge(); ++edgIter)
       {
         mesh::Edge edg = *edgIter;
         if (edg != ed)
         {
           if (lst.getVal(edg.vertex(0)) * lst.getVal(edg.vertex(1)) < 0.0 )
           {
             PNT._type = ON_EDGE_NEED;
             return;
           }
         }
       }
   ...
}

0 个答案:

没有答案