【问题标题】:get segmentation fault when I try to use tbb to parallel my program当我尝试使用 tbb 并行我的程序时出现分段错误
【发布时间】:2019-09-12 13:39:50
【问题描述】:

我的程序以串行方式运行良好,但是当我尝试使用 tbb 并行化它时出现分段错误。

我是 tbb 新手。我的程序很简单,但我不知道为什么会出错。我希望我能在这里得到一些帮助。下面是我的程序。

#include <iostream>
#include <opencv2/opencv.hpp>
#include <tbb/tbb.h>
using namespace std;
using namespace cv;
class test{
public:
    Mat * imgarr;
    test(){
        imgarr = new Mat[10];
        for(int i =0 ;i<10;i++){
            imgarr[i] = Mat::zeros(10,10,CV_64F);
        }
    }
    void add(int i) const {
        Mat& tmp = imgarr[i];
        tmp(Range(0,10),Range(0,10)) += 1;
    }
    void operator()(tbb::blocked_range<int>& r) const {
        for(int i = r.begin();i != r.end();i++){
            add(i);
        }
    }
    ~test(){
        delete[] imgarr;
    }

};
int main(){
    test a;
    tbb::parallel_for(tbb::blocked_range<int>(0,10), a);
    for(int i =0 ;i< 3;i++){
        cout << a.imgarr[0]<<endl;
    }
    return 0;
}

【问题讨论】:

  • 这个问题似乎根本没有包括任何解决问题的尝试。请编辑问题以显示您尝试过的内容,并使用Minimal, Reproducible Example 显示您遇到的特定障碍。欲了解更多信息,请参阅How to Ask
  • @liakoyras 很抱歉我没有在我的问题中显示太多有用的信息,我会更加关注社区规则。但我认为我的 sn-p 足够可重复且足够紧凑任何有 tbb 经验的人都可以告诉他们出了什么问题。我不想给你这样的印象,“我总是在弄脏手之前先寻求帮助”。在我得到任何有用的建议之前,我实际上是自己解决了这个问题,你可以通过查看我的GitHub commit history 来确认。我以为会更复杂。下次我会更加谨慎。
  • 别担心,一切都好。

标签: c++ opencv tbb


【解决方案1】:

tbb::parallel_for 创建提供的主体对象的多个副本。由于您没有为class test 提供任何复制构造函数,默认的只会复制状态,即imgarr 指针。然后,一旦由 TBB 创建的临时 test 对象被销毁,imgarr 将被释放,您将无法再使用它。

尝试将std::shared_ptr 用于imgarr

【讨论】:

  • 感谢您的帮助,原来是这样。我通过替换课外的imgarr解决了这个问题。
  • 不客气。欢迎来到堆栈溢出!建议在此处标记已接受的正确答案(有关详细信息,请参阅stackoverflow.com/help/someone-answers)-这样您可以帮助其他 SO 用户更快地找到有用的信息。
猜你喜欢
  • 1970-01-01
  • 2018-10-13
  • 2017-08-30
  • 1970-01-01
  • 2011-07-11
  • 1970-01-01
  • 1970-01-01
  • 2015-04-16
  • 2020-09-25
相关资源
最近更新 更多