Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 推回过程中的分段故障_C++_Segmentation Fault_Stdvector_Push Back - Fatal编程技术网

C++ 推回过程中的分段故障

C++ 推回过程中的分段故障,c++,segmentation-fault,stdvector,push-back,C++,Segmentation Fault,Stdvector,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::vect

我在下面的循环中遇到了一个非常奇怪的分段错误。 目标是让每个处理器对存储在以下向量上的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);
该代码甚至可以与4个处理器一起工作

我还注意到分段错误总是与秩2相关。因此,如果我在上面两行中的一行前面设置条件if(my_rank!=2),代码在4个处理器中工作

关于这个问题,我看到的帖子很少,但在大多数情况下,错误都是由传递到push_back()的空指针引起的

在这里,我只回推一个整数,对我来说,当它被推到一个向量时,它显然是存在的

你知道我怎么能抓住这个错误吗


谢谢你

当你同时尝试
推送包
时,你经常会出现分段错误的原因是,在一个线程中,你可以尝试
推送回
,向量被重新分配(因此所有迭代器都无效),而另一个线程尝试
推送回
到现在无效的内存中(另一个线程“不知道”向量同时被重新分配,即将使用无效的迭代器)


可能重复的

嗯,你说用4个处理器来编写代码。你是说用OpenMP之类的东西来并行外环吗?如果是这样的话,我希望这些线路会发生故障,因为它们在同一个阵列上运行。你是想用
哪个点[I]
而不是
哪个点[my\u rank]
?每个处理器上指向不同的向量。这应该是指向[my\u rank]的向量。显示您的并行代码。您承认单线程工作正常,因此我们不得不猜测错误是如何引入的。您使用术语“rank”让我觉得你在使用MPI,如果是的话,那么就意识到多进程不同于多线程。@Adam你是对的,我在使用MPI。我已经在问题中做了澄清。谢谢你,并且
n\u proc
初始化正确了吗?
my\u rank
是否可以等于或大于
n\u proc
(不应该是,但可能你在其他地方有个bug)。我不是这方面的专家,但我相信这是另一种情况。处理器不共享内存,至少这是我的意图。此外,循环结束时的向量
,应该具有不同的属性sizes@giorgk我只是认为这两个
push_back
是并行完成的,即
which_proc[my_rank].push_back(i);哪个点[我的排名]。push_back(j);
,如果是这样的话,就有麻烦了。另外,这真的是多进程代码还是多线程代码?这会产生很大的不同。我已经对这个问题做了澄清。这是一个多进程代码。
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);
                    }
              }
         }
    } 
}
which_proc[my_rank].push_back(i); or 
which_point[my_rank].push_back(j);