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つのプロセスを持ってする必要はありません、私は右ですか? – Waypoint
@Hmyzak明確にするために 'consumed()'と 'produced()'を表示することができますか? –
オブジェクトの作成時には1を返し、消費時には0を返します。私はちょうどその方法を実装する方法を考えています。プロセス0とプロセス0の両方のプロセスが生産を担当し、プロセス1が消費を処理します。 – Waypoint