2011-03-26 10 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를 비 차단 필요가 없습니다. 문제는 아무것도 클라이언트 상태를 변경하지 않으므로 아무 것도 수신하지 않는다는 것입니다. while 루프가 정말 이상 필요하지 않습니다

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

참고하지만 서버 수신 된 데이터를 확인하신 후, 나는 당신이 데이터를 수신 클라이언트를 검사 할 것입니다 가정 :보십시오.

편집 :consumed()produced()

+0

감사에 대한 소스 코드를 반영하도록 변경,하지만 난 이동할 때 = 클라이언트에() 생산,이 개 과정을 할 필요는 내가 맞다, 없다? – Waypoint

+0

@Hmyzak 명확히하기 위해'consumed()'와'produced()'를 보여줄 수 있습니까? –

+0

객체를 만들면 1을 반환하고 소비되면 0을 반환합니다. 두 가지 프로세스, 즉 프로세스 0은 생산을 담당하고 프로세스 1은 소비를 처리하는 방법을 궁금합니다. – Waypoint

관련 문제