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_post1 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.

questionAnswers(2)

yourAnswerToTheQuestion