繁体   English   中英

push_back期间出现分段错误

[英]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转换为现在的东西无效的内存(另一个线程“不知道”向量是同时被重新分配的,即将使用无效的迭代器)。

std :: vector或boost :: vector线程的可能重复是否安全?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM