Die Sleeping Barber Problem ist ein klassisches Synchronisationsproblem, das viele von Ihnen vielleicht vertraut sind oder zumindest gehört haben.Sleeping Barber-Algorithmus (mit mehreren Friseuren)
Es basiert auf der Prämisse, dass ein Friseur (ein Thread) schläft, wenn es keine Kunden (jeder Kunde ist ein Thread) im Wartezimmer (die eine Semaphore ist). Wenn jemand da ist, schneidet er sich die Haare (symbolisiert etwas Verarbeitung) und der Kunde geht. Wenn dann niemand im Warteraum ist, geht der Barbier schlafen. Wenn ein anderer Kunde ankommt, muss er den Friseur aufwecken.
Ich habe eine Umsetzung dieser mit dem folgenden Grundidee
(obwohl der eigentliche Code ist in C
, schrieb ich die folgende Pseudo-Code für die Syntax ohne viel Sorgfalt für Gründe des Problem understading, nur sem_wait
und sem_post
für glattere Lesung mit)
Semaphore Customers = 0;
Semaphore Barber = 0;
Mutex accessSeats = 1;
int NumberOfFreeSeats = N;
Barber {
while(1) {
sem_wait(Customers); // waits for a customer (sleeps)
sem_wait(accessSeats); // mutex to protect the number of available seats
NumberOfFreeSeats++; // a chair gets free
sem_post(Barber); // bring customer for haircut
sem_post(accessSeats); // release the mutex on the chair
// barber is cutting hair
}
}
Customer {
while(1) {
sem_wait(accessSeats); // protects seats so only 1 thread tries to sit in a chair if that's the case
if(NumberOfFreeSeats > 0) {
NumberOfFreeSeats--; // sitting down
sem_post(Customers); // notify the barber
sem_post(accessSeats); // release the lock
sem_wait(Barber); // wait in the waiting room if barber is busy
// customer is having hair cut
} else {
sem_post(accessSeats); // release the lock
// customer leaves
}
}
}
Allerdings, jetzt, dass ich dieses Problem mit mehreren Friseuren implementieren werde, blieb mein Kopf stecken. Ich ging auf Wikipedia, um zu sehen, ob ich etwas dagegen finden konnte, aber das einzige, was ich fand, da war dieser
Ein Mehrbett Barbiere Problem die zusätzliche Komplexität zu koordinieren mehrere Barbiere unter den wartenden Kunden hat.
und ich konnte dies von mir nicht herausfinden .
Welche Änderungen müsste ich in meinem Code vornehmen? Wo würde ich hier einen zusätzlichen Semaphor brauchen?
sem_wait()
sperrt die Semaphore. sem_post()
entriegelt es
Haftungsausschluss: Obwohl ich dies in programmers.stackexchange aswell gefragt haben, habe ich nicht eine gewünschte Antwort und meine Frage bleibt noch erreicht haben.
Vielleicht könnten Sie es mit dem Produzenten/Verbraucher mischen s Problem. Immer wenn ein Client ankommt, wird er einer FIFO-Struktur zugewiesen, die durch Semaphoren geschützt ist. Die Friseure werden die Kunden aus dem FIFO "konsumieren". Ich werde versuchen, später einen Blick auf den Code zu werfen .... – fvdalcin
[Hier] (http://www.albahari.com/threading/part4.aspx#_Wait_Pulse_Producer_Consumer_Queue) ist die beste Erklärung, die ich von einem gesehen habe Erzeuger/Verbraucher-Warteschlange. Es ist in C# geschrieben, aber Sie könnten Glück haben, es in C. zu übersetzen. – mbeckish
Die genauen Details der Koordination zwischen Barbier und Kunden werden stark davon abhängen, was Sie mit "Haarschnitt" meinen. –