可以避免死锁的情形
CALL MPI_COMM_RANK(comm, rank, ierr)
IF (rank.EQ.0) THEN
 CALL MPI_SEND(sendbuf, count, MPI_REAL, 1, tag, comm, ierr)
 CALL MPI_RECV(recvbuf, count, MPI_REAL, 1, tag, comm, status, ierr)
ELSE (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

讲解:

可以避免死锁的情形

 
图7-3 可以避免死锁的情形

C的完成只需要A完成,而A的完成只要有对应的D存在,则不需要系统提供缓冲区也可以进行,这里恰恰满足这样的条件,因此A总能够完成,因此D也一定能完成。当A和D完成后,B的完成只需要相应的C,不需要缓冲区也能完成,因此B和C也一定能完成,所以说这样的通信形式是安全的。显然A和C,D和B同时互换,从原理上说和这种情况是一样的,因此也是安全的。