2017-03-01 1 views
0

난 다음 텍스트에서, 내가 세마포어에 대한 의사 코드를 작성해야 프로젝트가 :동시 프로그래밍, 어떻게 세마포를 구성합니까?

는 "하나의 택시 토요일 축구 경기 시내 중심가에서 맨체스터 유나이티드와 리버풀 서포터를 복용하는 경우를 생각해 볼 수 있습니다. 택시는 한 번에 4 명의 서포터를 수용 할 수 있으며, 서포터를 태울 때 항상 수용할만한 상태입니다. 그러나 택시가 스스로 격리 된 한 팀의 서포터를 포함하는 상황은 결코 발생하지 않습니다. 택시는 여러 번의 여행을 수행합니다 처음 도착하면 두 대기자 중 하나의 대기열에 무작위로 신호를 보냅니다. 신호가있을 때마다 대기열에 항상 하나 이상의 지지자가 대기하고 있다고 가정 할 수 있습니다. 서포터가 택시에 입장 할 때 여전히 여유 공간이있는 경우 택시에있는 더 많은 지지자들에게 서포터 (누가 택시에 들어갔다.) 대기열에있는 또 다른 기다리고있는 서포터에게 택시에 입장하라는 신호를 보낸다. 가능하다면 서포터는 신호 할 큐를 무작위로 선택할 것입니다. 그러나 필요한 경우 특정 대기열을 선택하여 반대 서포터가있는 택시에서 단일 서포터가 격리되지 않도록합니다.

마지막 지지자는 택시에서 4 명의 지지자의 전체 코호트를 완료하기 위해 택시 (운전자)에게 신호를 보내고 축구장으로 가져갑니다. 택시는 목적지로 목적지까지 이동 한 다음 돌아와주기를 반복합니다. 맨체스터 유나이티드 서포터와 누가 리버풀 서포터인지 구별 할 수있는 서포터 만 (택시 운전사가 아닌) 유의하십시오. "

내가 가지고있는 노트를 적용하는 데 문제가 있으며 무엇이 도움이되는지 알고 있습니다. 온라인이 시나리오에

필자가 지금까지 수행 Heres는 무엇을 :.?

여기
int numManInTaxi = 0; //current no. of ManU supporters in taxi 
int numLivInTaxi = 0; 

sem MaxUnitedFans = 4; // // max no. of supporters that can fit in taxi 
sem MaxLivFans = 4; 

sem MMutexSem = 1; 
sem LMutexSem = 1; 

CO 
for (count = 1 to ManUSupporter){ 
ManUProcess[count]; 

// 
for (count = 1 to LivSupporter){ 
LivProcess[count]; 
OC 
} /*end main process 


process ManUProcess [i = 1 to N]{ 

P(MMutexSem); // mutually exclusice access for United supporter 
numManUInTaxi++; 

if ((numManInTaxi+numLivInTaxi) < 4) 
    {  
if (numManuInTaxi == 3) { // signal the Man queue 
numManUInTaxi++; 
} else if ((numManUInTaxi ==1) && (numLivInTaxi==2)){ 
numManUInTaxi++; 
} else if ((numManInTaxi == 2) &&(numLivInTaxi==1)) { 
V(MMutexSem); 
NumLivInTaxi++;} 

//end ManU supporter semaphore 
+1

을 make- 수있는 것입니다 당신은 더 나은를 얻을 수 있습니다 당신이 시도한 것을 보여주고, 자신을 돕기 위해 시간을 투자했음을 증명할 수 있다면 답하십시오. See [Ask] –

+0

나는 그것을 만들려고 노력했지만 메신저가 정확하지 않다는 것을 거의 확신한다. 시나리오에서는 하나의 택시에 남성 4 명, 서포터 2 명 또는 리버풀 지지자 4 명 중 하나가 될 수 있습니다. 지지자의 한 세트가 다른 한 세트보다 많은 수의 시나리오가 없어야합니다. – 944jmc

+0

죄송합니다, 새로운 기능, 지금 주 질문에 추가 – 944jmc

답변

0

난 당신이 시도 무엇

int numManInTaxi = 0; //current no. of ManU supporters in taxi 
int numLivInTaxi = 0; 
int seats=4;   //no of seats available empty 

sem taxi=1;    //to wait for taxi to send signal 
sem seats=0;   //signal generated by taxi or passenger for next passenger 

wait(taxi);    //taxi is available 
{ 
    signal(seat);  //taxi generates signal 

    while(wait(seats)) //check if there are seats available 
    { 
     int i=rand()%2; //random number 0 or 1 used to select between 2 queues 

     if(i==0) 
     numManInTaxi++; //passenger supports ManU 
     else 
     numLivInTaxi++; //passenger supports Liv 

     seats--; 
     if(seats>1)  //passenger generates signal for next passenger to enter 
      signal(seat); 
    } 


    /*Now three seats are filled and we have one empty seat left which is to 
     be filled such that there is no lone supporter of a team in taxi*/ 


    signal(seat);  //signal for last seat 

    wait(seat);   //last passenger recieves the signal 
    seats--; 
    if(numManInTaxi==1) //if only one supporter belongs to ManU 
     numManInTaxi++; 
    else 
     numManInTaxi++; 
} 




//taxi drops passengers 
numManInTaxi=0; 
numManInTaxi=0; 
seats=4; 
signal(taxi); //taxi is ready for next trip