2017-11-06 4 views
2

geweckt. Der folgende Code stammt von Wiki.Andere Prozesse werden nicht mit Semaphor

wait(Semaphore s){ 
    s=s-1; 
    if (s<0) { 
     // add process to queue 
     block(); 
    } 
} 

signal(Semaphore s){ 
    s=s+1; 
    if (s>=0) { 
     // remove process p from queue 
     wakeup(p); 
    } 
} 

Was passiert, wenn ich mehr als 2 Prozess haben, während die Kapazität 1 (s wird auf 1 initialisiert)? Zum Beispiel tritt Prozess 1 in die kritische Sitzung ein. Dann rufen Prozess 2 und 3 wait auf. s entspricht -2 jetzt. Dann beendet der Prozess 1 und ruft signal auf. s wird -1. Da s >= 0 nicht zufrieden stellend ist, würden die Prozesse 2 und 3 niemals aufgeweckt werden. Was ist das Problem hier?

+0

Der Code falsch ist, muss es 'if (s <= 0) {Wakeup (p)} sein' – yakout

Antwort

0

Werfen Sie einen Blick auf

https://en.wikipedia.org/wiki/Semaphore_(programming)

als Link auf die Wiki Bücher gegenüber.

Im Wiki-Artikel und Windows sind Semaphore Null oder haben eine positive Anzahl und könnte mit unsigned Ganzzahlen für die Zählung implementiert werden. Die Wartefunktion für ein Semaphor dekrementiert das Semaphor nicht, wenn es bereits Null ist, stattdessen wartet es nur. Wenn mehrere Prozesse oder Threads auf einen Semaphor mit count == 0 warten, wird, wenn der Semaphor um 1 inkrementiert wird, nur einer der Prozesse oder Threads aktiviert (und der Semaphor wieder auf Null dekrementiert), und er arbeitet Systemabhängig für welche man aufgewacht sein wird.

Link zu Windows Semaphor Beschreibung mit zusätzlichen Links zu Semaphore-Funktionen.

https://msdn.microsoft.com/en-us/library/windows/desktop/ms685129(v=vs.85).aspx