当我尝试使用 tbb 并行我的程序时出现分段错误
get segmentation fault when I try to use tbb to parallel my program
我的程序在串行方式下运行良好,但是当我尝试使用 tbb 对其进行并行化时出现分段错误。
我是 tbb 绿色 hand.My 程序非常简单,但我不明白为什么会出错。我希望我能在这里得到一些帮助。下面是我的程序。
#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;
}
tbb::parallel_for
创建提供的正文对象的多个副本。由于您没有为 class test
提供任何复制构造函数,默认的复制构造函数将只复制状态,即 imgarr
指针。然后,一旦 TBB 创建的临时 test
对象被销毁,imgarr
就会被释放,您将无法再使用它。
尝试对 imgarr
使用 std::shared_ptr
。
我的程序在串行方式下运行良好,但是当我尝试使用 tbb 对其进行并行化时出现分段错误。
我是 tbb 绿色 hand.My 程序非常简单,但我不明白为什么会出错。我希望我能在这里得到一些帮助。下面是我的程序。
#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;
}
tbb::parallel_for
创建提供的正文对象的多个副本。由于您没有为 class test
提供任何复制构造函数,默认的复制构造函数将只复制状态,即 imgarr
指针。然后,一旦 TBB 创建的临时 test
对象被销毁,imgarr
就会被释放,您将无法再使用它。
尝试对 imgarr
使用 std::shared_ptr
。