【问题标题】:QT--OpenMP run time error SIGSEGVQT--OpenMP 运行时错误 SIGSEGV
【发布时间】:2014-11-21 09:35:54
【问题描述】:

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

【问题讨论】:

    标签: c++ qt openmp segmentation-fault


    【解决方案1】:

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

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

    尽管如此,我想你真的想把这个变量设为 shared 一个:

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

    【讨论】:

    • 我不应该共享 objVector,因为每个线程都可以更改它的索引。而其他线程不知道这一点。只有主线程应该知道这一点。
    • @Sdn 基于您发布的代码,我看不到给定索引下对同一元素的任何并发访问,因此我想您不需要将向量复制到所有线程,但这取决于您
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多