C MPI-生产者和消费者

C MPI-生产者和消费者,c,mpi,C,Mpi,如何简单地制作生产者和消费者应用程序。生产者制作项目,将其发送给消费者,而消费者等待,直到他拥有该项目。他使用它,物品消失,他向制作人发送创建新物品的请求。一次又一次 我有一些MPI_发送和MPI_接收组合模式,但它只运行一次。生产者生产一件商品,消费者消费一件商品,应用程序陷入僵局。我应该使用非阻塞接收和发送吗 int count=10; if(myrank==0){ //server for(i=0;i<10;i++){ MPI_Recv(&a,1,MPI_I

如何简单地制作生产者和消费者应用程序。生产者制作项目,将其发送给消费者,而消费者等待,直到他拥有该项目。他使用它,物品消失,他向制作人发送创建新物品的请求。一次又一次

我有一些MPI_发送和MPI_接收组合模式,但它只运行一次。生产者生产一件商品,消费者消费一件商品,应用程序陷入僵局。我应该使用非阻塞接收和发送吗

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();

    }

 } 

您不应该为此需要非阻塞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();
}
else{//client
a=0;

对于(i=0;iThanks,但是当我将a=producted()移动到客户端时,不需要有两个进程,对吗?@Hmyzak这取决于您能否显示
consumered()
producted()
澄清一下吗?创建对象时它只返回1,使用对象时返回0。我只是想知道如何实现它,这两个进程到它们的作业-进程0负责生产,进程1负责消费。@Hmyzak我更新了答案以反映更新后的问题。
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();
}