Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/153.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ QT—OpenMP运行时错误SIGSEGV_C++_Qt_Openmp_Segmentation Fault - Fatal编程技术网

C++ QT—OpenMP运行时错误SIGSEGV

C++ QT—OpenMP运行时错误SIGSEGV,c++,qt,openmp,segmentation-fault,C++,Qt,Openmp,Segmentation Fault,为什么这段代码会生成SIGSEGV异常?我使用QtCreator,C++,Openmp // myObj : a class name vector <myObj> objVector; ....... void MainWindow::drawScreen() { omp_set_num_threads(objVector.size()); #pragma omp parallel private (ob

为什么这段代码会生成SIGSEGV异常?我使用QtCreator,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();
    }

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

#pragma omp parallel firstprivate(objVector)
//                   ~~~~~~~~~~~^
尽管如此,我想你真的想让这个变量成为共享的:

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

我不应该共享objVector,因为每个线程都可以更改它的索引。其他线程不知道这一点。只有主线程才应该知道这一点。@Sdn根据您发布的代码,在给定的索引下,我看不到对同一元素的任何并发访问,因此我认为您不需要将向量复制到所有线程,但这取决于您
#pragma omp parallel shared(objVector)
//                   ~~~~~^