为什么这段代码会生成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;
}

最佳答案

private子句为类类型变量调用默认构造函数。换句话说,您的每个线程都在通过其默认构造函数初始化的std::vector新(空)实例上运行。
对于vector的复制构造,应使用firstprivate子句:

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


尽管如此,我想您真的打算将此变量设置为shared一个:

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

09-06 05:42