2013-03-29 49 views
1

后发送的消息我一直在做并行实现哲学家就餐问题,并已经开始,我解决不了问题。基本上,我有一个for循环,其中一个进程检查任何新的消息,然后睡半秒钟(它重复这个随机次数)。在那之后,它试图收集所有需要的分支,以启动程序的“吃饭”部分。MPI_Irecv没有收到环路

的问题是,由于某种原因,如果我从里面的for循环发送MPI消息,目标进程临危它正常,但如果我在循环之后发送一条消息,它没有。让我展示了如何看起来代码,希望这将让事情更清楚:

for (int i = 0; i < think; i++) { 
     Sleep(500); 

     // Recieve messages 
     MPI_Irecv(&rcv, 1, MPI_INT, MPI_ANY_SOURCE, NEED_FORK, MPI_COMM_WORLD, &req); 
     MPI_Test(&req, &flag, &status); 

     if(flag != 0) { 
      // Do stuff 
     } 
     MPI_Send(&myid, 1, MPI_INT, target, NEED_FORK, MPI_COMM_WORLD); // He recieves this 
    } 
MPI_Send(&myid, 1, MPI_INT, target, NEED_FORK, MPI_COMM_WORLD); // He doesn't recieve this 

的问题是,由于某种原因,该targert过程中不会收到for循环结束后发送的任何消息而它接收在循环之前或期间发送的任何消息。我真的不知道该怎么做,使这项工作,将不胜感激任何帮助......

+0

我还没有找到答案,但我敢肯定,有什么问题我用的是MPI_TEST功能的方式。由于某种原因,睡眠功能似乎不太合适...... – IanZG

+3

澄清:循环内有一个MPI_Irecv和一个MPI_Send。循环的每次迭代将在MPI_Send/MPI_Irecv之间进行1:1匹配。但是,循环后的MPI_Send没有匹配的MPI_Irecv。在循环之后,MPI_Send的匹配MPI_ [I] recv调用在哪里? –

回答