ソース 5.4.1 キャンセル
C |
---|
プログラム |
#include <stdio.h> #include <mpi.h> #include <unistd.h> #define NUMOF(array) (sizeof (array) / sizeof *(array)) #define STRLEN(literal) (NUMOF(literal) - 1) enum TAG_KIND // 通信タグ { TAG_HELLO, // Hello 文字列通信タグ }; enum RANK_KIND // ランク { RANK_SENDER, // 送信側のランク RANK_RECVER, // 受信側のランク }; // 送信 void Send() { puts("Nothing to do :p"); } // 受信 void Recv() { char hello[64]; MPI_Status status; MPI_Request req; int i; int cancelled; const int waitTime = 3; // 待つ回数 MPI_Irecv(hello, STRLEN(hello), MPI_CHAR, RANK_SENDER, TAG_HELLO, MPI_COMM_WORLD, &req); // 何回か待ちます for(i = 0; i < waitTime; ++i) { int complete; MPI_Test(&req, &complete, &status); if(complete) { // 永遠に実行されない可哀想なコード :p int recvCount; puts("Complete!"); MPI_Get_count(&status, MPI_CHAR, &recvCount); hello[recvCount] = '\0'; printf("Received bytes : %d\n", recvCount); printf("Received text : %s\n", hello); return; } puts("Waiting..."); sleep(1); } // キャンセル MPI_Cancel(&req); MPI_Wait(&req, &status); MPI_Test_cancelled(&status, &cancelled); if(cancelled) { puts("Cancelled!"); } else // ライブラリにバグがない限り実行されません { puts("???"); } } int main(int argc, char** argv) { int rank; MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &rank); switch(rank) { case RANK_SENDER: Send(); break; case RANK_RECVER: Recv(); break; } MPI_Finalize(); printf("Exit : %d\n", rank); } |
実行結果例 |
Nothing to do :p Waiting... Exit : 0 Waiting... Waiting... Cancelled! Exit : 1 |
Last update was done on 2002.11.14