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 emC
Eu escrevi o seguintepseudo-código sem muito cuidado com a sintaxe por causa do entendimento de problemas, usando apenassem_wait
esem_post
1 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.