Algoritmo Sleeping Barber (com vários barbeiros)

oProblema do Barbeiro Adormecido é um problema clássico de sincronização com o qual muitos de vocês podem estar familiarizados ou pelo menos ouvir falar.

É baseado na premissa de que um barbeiro(um fio) dorme quando não há clientes(cada cliente é um segmento) na sala de espera(que é um semáforo). Se houver alguém, ele corta o cabelo (simbolizando algum processamento) e o cliente sai. Se, então, não houver ninguém na sala de espera, o barbeiro vai dormir. Quando outro cliente chega, ele deve acordar o barbeiro.

Eu fiz uma implementação disso usando a seguinte idéia básica

(embora o código real esteja emCEu escrevi o seguintepseudo-código sem muito cuidado com a sintaxe por causa do entendimento de problemas, usando apenassem_wait esem_post1 para uma leitura mais suave)

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
        }
   }
}

No entanto, agora que vou implementar esse problema com vários barbeiros, minha cabeça ficou presa. Eu fui na Wikipedia para ver se eu poderia encontrar algo sobre isso, mas a única coisa que eu encontrei lá foi este

Um problema de vários barbeiros adormecidos tem a complexidade adicional de coordenar vários barbeiros entre os clientes em espera.

e eu não conseguia descobrir isso sozinho2.

Quais alterações eu teria que fazer no meu código? Onde eu precisaria de um semáforo extra aqui?

1sem_wait() bloqueia o semáforo.sem_post() destrava
2Disclaimer: Embora eu tenha solicitado isso emprogramadores.stackexchange também não cheguei a uma resposta desejada e minha pergunta ainda persiste.

questionAnswers(2)

yourAnswerToTheQuestion