Algorytm Sleeping Barber (z wieloma fryzjerami)
TheProblem ze śpiącym fryzjerem jest klasycznym problemem synchronizacji, z którym wielu z was może być zaznajomionych lub przynajmniej o nich wiedzieć.
Opiera się na założeniu, że fryzjer(wątek) śpi, gdy nie ma klientów(każdy klient jest wątkiem) w poczekalni(który jest semaforem). Jeśli jest ktoś, tnie włosy (symbolizując pewne przetwarzanie) i pozostawia kostiumer. Jeśli więc w poczekalni nie ma nikogo, fryzjer idzie spać. Kiedy przybywa inny klient, musi obudzić fryzjera.
Wykonałem to za pomocą następującego podstawowego pomysłu
(chociaż rzeczywisty kod jest wC
, Napisałem następującepseudo kod bez dbałości o składnię ze względu na występowanie problemów, tylko używaniesem_wait
isem_post
1 dla łatwiejszego czytania)
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
}
}
}
Jednak teraz, gdy wdrożę ten problem z wieloma fryzjerami, moja głowa utknęła. Poszedłem na Wikipedię, aby zobaczyć, czy mogę coś o tym znaleźć, ale jedyne, co znalazłem, to było to
Wielokrotny problem spania fryzjerów dodatkowo komplikuje koordynację kilku fryzjerów wśród oczekujących klientów.
i sam nie mogłem tego zrozumieć2.
Jakie zmiany musiałbym zrobić w moim kodzie? Gdzie będę potrzebował dodatkowego semafora?
1sem_wait()
blokuje semafor.sem_post()
odblokowuje go
2Disclaimer: Chociaż poprosiłem o to wprogrammers.stackexchange tak samo nie osiągnąłem pożądanej odpowiedzi, a moje pytanie wciąż trwa.