Você está na página 1de 4

A soluo aqui apresentada usa trs semforos: customers, que conta os clientes espera de atendimento (exceto o cliente que

e est na cadeira de barbeiro, que no est esperando); barbers, o nmero de barbeiros (0 ou 1) que esto ociosos espera de clientes, e mutex, que usado para excluso mtua. Precisamos ainda de uma varivel, waiting, que tambm conta os clientes espera de atendimento. essencialmente uma cpia decustomers. A razo de se ter waiting que no h uma maneira de ler o valor atual do semforo. Nessa soluo, um cliente que entra na barbearia deve contar o nmero de clientes espera de atendimento. Se este for menor que o nmero de cadeiras, ele ficar; do contrrio, ele sair. Na soluo, quando chega de manh para trabalhar, o barbeiro executa o mtodo barber, que o leva a bloquear sobre o semforocustomers, que inicialmente est em 0. O barbeiro ento vai dormir, e permanece dormindo at que o primeiro cliente aparea. Quando chega, o cliente executa customer e inicia obtendo mutexpara entrar em uma regio crtica. Se um outro cliente chega logo em seguida, o segundo nada pode fazer at que o primeiro libere omutex. O cliente ento verifica se o nmero de clientes espera menor que o nmero de cadeiras. Se no for, ele liberar o mutexe sair sem cortar o cabelo. Se houver uma cadeira disponvel, o cliente incrementar a varivel inteira waiting. Ele faz ento um up no semforocustomers, que acorda o barbeiro. Nesse ponto, o cliente e o barbeiro esto ambos acordados. Quando o cliente libera mutex, o barbeiro o pega, faz alguma limpeza e comea a cortar o cabelo. Quando termina o corte de cabelo, o cliente sai do procedimento e deixa a barbearia. Diferente de nossos exemplos anteriores, no h um lao para o cliente porque para cada um deles ter apenas um corte de cabelo. O barbeiro, contudo, contm um lao para tentar obter o prximo cliente. Se houver algum outro cliente, um novo corte de cabelo ser iniciado. Do contrrio, o barbeiro cair no sono.

Cdigo: #include "stdio.h" #include "unistd.h" #include "stdlib.h" #include "pthread.h" #include "semaphore.h" #define CHAIRS 5 espera */ #define TRUE 1 sem_t customers; atendimento */ sem_t barbers; clientes */ sem_t mutex; int waiting = 0; esto cortando) */ /* prottipos */ void* barber(void *arg); void* customer(void *arg); /* nmero de cliente espera de /* nmero de barbeiros espera de /* para excluso mtua */ /* clientes que esto esperando (no /* nmero de cadeiras para os clientes

void cut_hair(); void customer_arrived(); void get_haircut(); void giveup_haircut(); int main() { sem_init(&customers, TRUE, 0); sem_init(&barbers, TRUE, 0); sem_init(&mutex, TRUE, 1); pthread_t b, c; /* criando nico barbeiro */ pthread_create(&b, NULL, (void *) barber, NULL);

/* criao indefinida de clientes */ while(TRUE) { pthread_create(&c, NULL, (void *) customer, NULL); sleep(1); } return 0; } void* barber(void *arg) { while(TRUE) { sem_wait(&customers); sem_wait(&mutex); waiting = waiting - 1; espera */ sem_post(&barbers); cabelo */ sem_post(&mutex); cut_hair(); } pthread_exit(NULL); } void* customer(void *arg) { sem_wait(&mutex); if(waiting < CHAIRS) { customer_arrived(); waiting = waiting + 1; /* incrementa o contador de clientes espera /* entra na regio crtica */ /* se no houver cadeiras vazias, saia */ /* vai dormir se o nmero de clientes for 0 */ /* obtm acesso a 'waiting' */ /*descresce de um o contador de clientes /* um barbeiro est agora pronto para cortar /* libera 'waiting' */ /* corta o cabelo (fora da regio crtica) */

*/ sem_post(&customers); sem_post(&mutex); sem_wait(&barbers); for 0 */ get_haircut(); } else { sem_post(&mutex); giveup_haircut(); } pthread_exit(NULL); } void cut_hair() {

/* acorda o barbeiro se necessrio */ /* libera o acesso a 'waiting' */ /* vai dormir se o nmero de barbeiros livres /* sentado e sendo servido */ /* a barbearia est cheia; no espera */

printf("Barbeiro estah cortando o cabelo de alguem!\n"); sleep(3); } void customer_arrived() { printf("Cliente chegou para cortar cabelo!\n"); } void get_haircut() { printf("Cliente estah tendo o cabelo cortado!\n"); } void giveup_haircut() { printf("Cliente desistiu! (O salao estah muito cheio!)\n"); }