总会死锁的情形
CALL MPI_COMM_RANK(comm, rank, ierr)
IF (rank.EQ.0) THEN
CALL MPI_RECV(recvbuf, count, MPI_REAL, 1, tag, comm, status, ierr)
CALL MPI_SEND(sendbuf, count, MPI_REAL, 1, tag, comm, ierr)
ELSE IF( rank .EQ. 1)
CALL MPI_RECV(recvbuf, count, MPI_REAL, 0, tag, comm, status, ierr)
CALL MPI_SEND(sendbuf, count, MPI_REAL, 0, tag, comm, ierr)
END IF

讲解:
进程0的第一条接收语句A能否完成取决于进程1的第二条发送语句D,即A依赖于D,从执行次序上可以明显地看出,进程0向进程1发送消息的语句C的执行又依赖于它前面的接收语句A的完成,即C依赖于A;同时,进程1的第一条接收语句B能否完成取决于进程0的第二条发送语句C的执行,即B依赖于C,从执行次序上可以明显地看出,向进程0发送消息的语句D的执行又依赖于B的完成,故有A依赖于D,而D又依赖于B,B依赖于C,C依赖于A,形成了一个环,进程0和进程1相互等待,彼此都无法执行下去,必然导致死锁。

总会死锁的情形

 

图7-1 总会死锁的情形