2011-03-26 216 views
0

如何簡單地製作生產者和消費者應用程序。生產者製作項目,將其發送給消費者,同時消費者等待,直到他擁有此項目。他使用它,項目不見了,他發送請求給製作人創建一個新的。再重複一遍。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; 

} 

回答

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

+0

由於源代碼,但是當我移動一個=產生()到客戶端,沒有必要爲具有2個進程,是嗎? – Waypoint 2011-03-26 08:45:11

+0

@Hmyzak它取決於你可以顯示'消耗()'和'生產()'澄清? – 2011-03-26 09:30:00

+0

它僅在創建對象時返回1,在消耗時爲0。我只是想知道如何以這種方式實現它,這兩個過程到他們的工作流程0負責生產,並且流程1負責消費。 – Waypoint 2011-03-26 09:30:50