2014-11-21 51 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