【问题标题】:MPI - producer and consumerMPI——生产者和消费者
【发布时间】:2011-07-23 09:25:10
【问题描述】:

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

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

}

【问题讨论】:

    标签: c mpi


    【解决方案1】:

    你不应该为此需要非阻塞 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() 的源代码

    【讨论】:

    • 谢谢,但是当我将 a=produced() 移动到客户端时,不需要有 2 个进程,对吗?
    • @Hmyzak 这取决于你能否显示consumed()produced() 来澄清一下?
    • 它只是在创建对象时返回 1,在使用对象时返回 0。我只是想知道如何以这种方式实现它,即两个流程都完成工作 - 流程 0 负责生产,流程 1 负责消费。
    • @Hmyzak 我已更新答案以反映更新后的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-31
    • 2011-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多