为什么这段代码会生成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)
// ~~~~~^