2017-12-09 17 views
-1

Ich mache einen Synchronisationsthread mit Semaphoren. Jetzt muss ich warten, bis einige Kunden-Threads mit Semaphoren im floor_clerk-Thread in der Warteschlange ankommen. Ich habe es vorher mit While-Schleife gemacht. Und customer thread muss auch warten, bis es von floor_clerk mit Semaphor unterstützt wird. Ich habe es vorher mit Tiefschlaf gemacht. Jede Wartezeit muss mit P (Semaphoren) (acquire) implementiert werden So sollte gewartet werden. Dies ist die Aufgabe: Floor Clerks warten (Semaphoren verwenden) für Kunden zu kommen; dann helfen sie ihnen mit allen Informationen, die sie brauchen. Floor-Mitarbeiter können jedoch nur einem Kunden gleichzeitig helfen. Daher muss ein Kunde warten (Semaphore verwenden), bis ein verfügbarer Sachbearbeiter ihm/ihr hilft.Busy Waiting mit Semaphor

Mein bisheriger Floor_clerk Code für Warte ist:

while (done != Main.csize) {   
    //wait while their is no customer in queue 
    while (queue.isEmpty() && done != Main.csize) { 
    } 

    //while their is a customer in queue assist customers 
    while (queue.size() != 0 && done != Main.csize) { 
     //some stuff to do 
    } 
} 

Bitte helfen Sie mir hier Semaphore zu implementieren.

+0

Bitte helfen Sie mir jemand ?? –

Antwort

0

Speichern Sie Ihre Clients einfach in einer blockierenden Warteschlange und verwenden Sie die take()-Methode, um zu blockieren, bis ein Client verfügbar ist. Es besteht keine Notwendigkeit, die Warteschlange und den Blockierungsmechanismus zu trennen, da dieser bereits in die Bibliothek eingebaut ist.

Wenn Sie einen Semaphor verwenden müssen, funktionieren Semaphore grundsätzlich mit einer blockierenden Warteschlange von "Genehmigungen". Sie sollten darüber nachdenken, wie diese Blockierungsfunktionalität zu dem passt, was Sie versuchen zu tun. Wenn ein Client verfügbar ist, möchten Sie release() eine Genehmigung und den Dienst zu zulassen. Wenn keine Genehmigungen vorhanden sind, blockiert der Dienst die Nummer .

// Add client 
queue.add(client); 
semaphore.release(); 

// Clerk loop 
while (true) { // Whatever condition 
    semaphore.acquire(); 
    Client client = queue.remove(); 
    // ... 
}