MPI - 生产者和消费者

时间:2011-03-26 07:13:55

标签: c mpi

如何简单地制作制作人和消费者应用。生产者制作商品,将其发送给消费者,而消费者等到他有这个商品。他使用它,项目已经消失,他发送请求为制作人创建新的。而且一遍又一遍。

我有一些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;

}

1 个答案:

答案 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()

的源代码