2011-03-26 17 views
0

プロデューサとコンシューマアプリケーションを簡単に作成する方法。プロデューサーメイクアイテムは消費者に送信され、消費者はこのアイテムがあるまで待機します。彼はそれを使用し、アイテムはなくなり、プロデューサーに新しいアイテムを作成するリクエストを送信します。そしてまた何度も何度も。MPI - プロデューサとコンシューマ

私はいくつかのMPI_sendとMPI_recvの組み合わせを持っていますが、ただ1回だけです。プロデューサは1つのアイテムを作成し、消費者は1つのアイテムを消費し、アプリケーションはデッドロックされます。非ブロッキング受信と送信を使用する必要がありますか?

int count=10; 
if(myrank==0){  //server 
for(i=0;i<10;i++){ 
    MPI_Recv(&a,1,MPI_INT,1,99,MPI_COMM_WORLD,&status); 
    if (a==0){ 
     a=produced(); //here it returns 1 
     MPI_Send(&a,1,MPI_INT,1,99,MPI_COMM_WORLD); 
    } 
    } 

} 
else{//client 
for(i=0;i<10;i++){ 
    if(a==0){ 
     a=0; 
     MPI_Send(&a,1,MPI_INT,0,99,MPI_COMM_WORLD); 
    }else{ 
     MPI_Recv(&a,1,MPI_INT,0,99,MPI_COMM_WORLD,&status); 
     a=consumed(); 
     n++; 
    } 
    if(n==count){ 
     MPI_Finalize(); 

    } 

} 

}

編集:

int produced(){ 
    sleep(1); 
    printf("Produced item\n"); 
    return 1; 

} 

int consumed(){ 
    sleep(1); 
    printf("Consumed item\n"); 
    return 0; 

} 

答えて

2

あなたは、このための非ブロックIOを必要はありません。問題は何もクライアント状態を変更しないので何も受信しないことです。 whileループは本当に上必要とされていない

else { //client 
    a=0; 
    for (i=0;i<10;i++) { 
    MPI_Send(&a,1,MPI_INT,0,99,MPI_COMM_WORLD); 
    do { 
     MPI_Recv(&a,1,MPI_INT,0,99,MPI_COMM_WORLD,&status); 
    } while (a != 1); 
    a=consumed(); 
    } 

    MPI_Finalize(); 
} 

注意がありますが、サーバ、受信したデータをチェックしてきたように、私はあなたがデータを受信したクライアントをチェックしたいと仮定:試してみてください。

編集:consumed()produced()

+0

感謝のソースコードを反映するために変更しましたが、私が移動したときに=生産()クライアントに、2つのプロセスを持ってする必要はありません、私は右ですか? – Waypoint

+0

@Hmyzak明確にするために 'consumed()'と 'produced()'を表示することができますか? –

+0

オブジェクトの作成時には1を返し、消費時には0を返します。私はちょうどその方法を実装する方法を考えています。プロセス0とプロセス0の両方のプロセスが生産を担当し、プロセス1が消費を処理します。 – Waypoint

関連する問題