C++ QT—OpenMP运行时错误SIGSEGV
为什么这段代码会生成SIGSEGV异常?我使用QtCreator,C++,OpenmpC++ 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
// 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)
// ~~~~~^