如何简单地制作制作人和消费者应用。生产者制作商品,将其发送给消费者,而消费者等到他有这个商品。他使用它,项目已经消失,他发送请求为制作人创建新的。而且一遍又一遍。
我有一些MPI_send和MPI_recv组合模式,但它只去了一次。制作人制作一个项目,消费者消费一个项目,应用程序陷入僵局。我应该使用非阻塞接收并发送吗?
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;
}
答案 0 :(得分:2)
你不应该需要非阻塞的io。问题是没有任何改变客户端状态因此它永远不会收到任何东西。尝试:
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();
}
注意上面并不真正需要while
循环,但是当您检查了服务器收到的数据时,我认为您需要检查收到的客户端数据。
修改:已更改以反映consumed()
和produced()