2014-11-21 94 views
1

为什么此代码生成SIGSEGV异常?我使用QT Creator,C++,Openmp。QT - OpenMP运行时错误SIGSEGV

// myObj : a class name 
    vector <myObj> objVector; 
    .......  
    void MainWindow::drawScreen() 
    { 
     omp_set_num_threads(objVector.size()); 
     #pragma omp parallel private (objVector) 
     { 
      int id = omp_get_thread_num(); 
      if(id > 0) { 
       bool collision = false; 
       int i = id-1;    
       objVector[i].update(); 
      } 
     } 
     this->repaint(); 
    } 

MyObj中类:

void myObject::update() { 

    int x = this->X; **// when I run debugging, SIGSEGV occurs this line!!!!!!!** 
    int y = this->Y; 
} 

回答

0

private子句调用默认构造类型变量。换句话说,您的每个线程都运行在新的(空)实例std::vector通过其默认构造函数初始化。 为载体的拷贝建设你应该使用firstprivate条款:

#pragma omp parallel firstprivate(objVector) 
//     ~~~~~~~~~~~^ 

尽管如此,我想你的真正用意,使这个变量shared之一:

#pragma omp parallel shared(objVector) 
//     ~~~~~^ 
+0

我不应该共享objVector,因为每个线程都可以改变它的索引。和其他线程不知道这一点。只有主线程应该知道这一点。 – Sdn 2014-11-21 10:29:11

+0

@Sdn根据你发布的代码我没有看到任何并发访问同一元素下给定的索引,因此我想你不需要复制矢量到所有线程,但它取决于你 – 2014-11-21 10:31:41