2017-03-01 8 views
0

Ich habe ein Projekt, wo ich Pseudo-Code für eine Semaphore zu schreiben, aus dem folgenden Text:Concurrent-Programmierung, wie baue ich einen Semaphor?

„ein Szenario vor, wo ein einzelne Taxi Manchester United und Liverpool Fans vom Stadtzentrum bis Samstag Fußballspiel stattfindet. Das Taxi kann vier Supporter gleichzeitig aufnehmen und es ist immer voll besetzt, wenn man Supporter trägt, aber die Situation darf niemals entstehen, wenn das Taxi einen Supporter eines der Teams isoliert von sich selbst enthält, das Taxi führt eine Reihe von Fahrten durch und wenn es zum ersten Mal ankommt, signalisiert es zufällig einer der Warteschlangen der beiden wartenden Supporter: Sie können davon ausgehen, dass immer ein oder mehrere Supporter in jeder Warteschlange warten, wenn es signalisiert wird, wenn ein Unterstützer das Taxi betritt und noch Platz ist für mehr Unterstützer im Taxi der Unterstützer (wer ha s ist gerade dem Taxi beigetreten) signalisieren einem anderen wartenden Unterstützer in einer der Warteschlangen, dass sie auch das Taxi betreten. Wo es möglich ist, wählt der Unterstützer nach dem Zufallsprinzip die Warteschlange aus, um sie zu signalisieren. Bei Bedarf wählt er jedoch eine bestimmte Warteschlange aus, um sicherzustellen, dass kein einzelner Unterstützer im Taxi mit gegnerischen Unterstützern isoliert wird.

Der letzte Unterstützer, der das Taxi betritt, um eine volle Kohorte von vier Unterstützern im Taxi zu vervollständigen, signalisiert dem Taxi (Fahrer), sie zum Fußballplatz zu bringen. Das Taxi bringt sie zu ihrem Bestimmungsort und kehrt dann zurück, um den Zyklus zu wiederholen. Beachten Sie, dass nur die Unterstützer (nicht der Taxifahrer) unterscheiden können, wer ein Unterstützer von Manchester United ist und wer ein Unterstützer von Liverpool ist. "

Ich habe Probleme beim Anwenden der Notizen, die ich habe Online diesem Szenario

Heres, was ive bisher getan.?

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-konnte Was haben Sie versucht, Sie werden mehr und besser Antworten Wenn du zeigst, was du versucht hast, und demonstrierst, dass du dir die Zeit genommen hast, dir selbst zu helfen. Siehe [Fragen] –

+0

Ich habe versucht, es zu bauen, aber ich bin fast sicher, dass es nicht korrekt ist. In dem Szenario kann es entweder 4 Unterstützungen von Mann vereint in einem Taxi, 2 von jedem Satz von Unterstützern oder 4 Liverpool-Unterstützer sein. Es sollte nicht ein Szenario geben, in dem eine Gruppe von Unterstützern von der anderen unterlegen ist. – 944jmc

+0

Entschuldigung, neu dazu, jetzt zur Hauptfrage hinzugefügt – 944jmc

Antwort

0

Hier ist, was ich

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