QT - OpenMP运行时错误SIGSEGV

时间:2014-11-21 09:35:54

标签: c++ qt openmp sigsegv

为什么此代码会生成SIGSEGV异常?我使用QT Creator,C ++,Openmp。

 // 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;
}

1 个答案:

答案 0 :(得分:0)

private子句为类型变量调用默认构造函数。换句话说,每个线程都在通过其default-constructor初始化的{em> new (空)实例std::vector上运行。 对于向量的 copy-construction ,您应该使用firstprivate子句:

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

尽管如此,我想你真的打算让这个变量为shared一个:

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