私は食事の哲学者の問題を並行して実装してきましたが、解決できない問題に直面しました。基本的に、プロセスが新しいメッセージをチェックしてから0.5秒間スリープするforループがあります(これをランダムな回数繰り返します)。その部分の後、プログラムの「食べる」部分を開始するために必要なすべてのフォークを集めようとします。
問題は、何らかの理由で、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
問題は、なんらかの理由で、ターゲット プロセスが for ループの終了後に送信されたメッセージを受信せず、ループの前またはループ中に送信されたメッセージを受信することです。これを機能させるために何をすべきか本当にわかりません。助けていただければ幸いです...