[英]segmentation fault during push_back
在以下循环中,我遇到了一个非常奇怪的细分错误。 目标是让每个处理器对存储在以下向量上的x / y点进行一些检查
只是要澄清一下:这是一个多处理器代码而不是多线程。 这就是我的排名:
int my_rank = Utilities::MPI::this_mpi_process(mpi_communicator);
std::vector<std::vector<double> > Xcoord(n_proc);
std::vector<std::vector<double> > Ycoord(n_proc);
Xcoord [i]是来自i处理器的x坐标的向量,当前处理器将对其进行一些检查,以下不包括它们:
该代码循环遍历n个处理器,首先检查它是否具有有关特定点的任何信息,如果是,则保存该点的ID和处理器的ID。
std::vector<std::vector<int> > which_point(n_proc);
std::vector<std::vector<int> > which_proc(n_proc);
for (int i = 0; i < n_proc; ++i){
if (i == my_rank) continue;
for (unsigned int j = 0; j < Xcoord[i].size(); ++j){
bool yit = getYiterator(yxmap, Ycoord[i][j], itY);
if (yit){
bool xit = getXiterator(itY->second, Xcoord[i][j], itX);
if (xit){
itZ = itX->second.zmap.begin();
for (; itZ != itX->second.zmap.end(); ++itZ){
which_point[my_rank].push_back(j);
which_proc[my_rank].push_back(i);
}
}
}
}
}
(在最里面的循环中,itX-> second.zmap.size()为3)
当我在一个处理器中运行代码时,一切正常。
当我使用4个处理器执行此操作时,出现了分段错误。
如果我删除两行之一
which_proc[my_rank].push_back(i); or
which_point[my_rank].push_back(j);
该代码甚至可以在4个处理器上运行。
我还注意到分段错误始终与等级2相关联。因此,如果我在以上两行之一的前面设置了条件(my_rank!= 2),则该代码可在4个处理器中工作。
我很少看到有关此问题的文章,但是在大多数情况下,错误是由传递给push_back()的空指针引起的。
在这里,我只推回一个整数,对我来说,这个整数显然在推向向量时就存在。
任何想法我怎么能抓住这个错误?
谢谢
当您同时尝试push_pack
时, push_pack
的原因是,在一个线程中您可能会尝试push_back
,重新分配向量(因此所有迭代器均无效),而另一个线程尝试将push_back
转换为现在的东西无效的内存(另一个线程“不知道”向量是同时被重新分配的,即将使用无效的迭代器)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.