Aluno: Misael Alexandre
Codificação
O problema do barbeiro sonolento é uma barbearia que há um barbeiro e um número de cadeiras. Se não há cliente, o barbeiro cai no sono. Quando um cliente chega, acorda o barbeiro e este corta seu cabelo. Se um cliente chega quando o barbeiro está cortando o cabelo de outro cliente e houver cadeira vaga, ele espera. Senão, vai embora. O problema é programar este problema sem que haja condições de disputa.
A solução empregada novamente foi a do Tanenbaum, e o código feito pode ser visto abaixo:
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <unistd.h> #include <pthread.h> #include <semaphore.h> #define CHAIRS 5 #define N 61 int i, j, int_rand, waiting; float float_rand; sem_t mutex; sem_t customers; sem_t barbers; //acao do barbeiro void *barber(void *arg){ while(1){ sem_wait(&customers); sem_wait(&mutex); waiting=waiting-1; sem_post(&barbers); sem_post(&mutex); cut_hair(); } } //acao do cliente void *customer(void *j){ int i= *(int*) j; sem_wait(&mutex); if(waiting < CHAIRS){ printf("Cliente %d entrou na barbearia!\n",i); waiting=waiting+1; sem_post(&customers); sem_post(&mutex); sem_wait(&barbers); get_haircut(i); }else{ sem_post(&mutex); printf("Cliente %d saiu da barbearia porque estava lotada!\n",i); } } void cut_hair(){ printf("Barbeiro corta cabelo de um cliente!\n"); float_rand=0.000001*random(); int_rand=float_rand; usleep(int_rand); } void get_haircut(int i){ printf("Cliente %d corta o cabelo!\n",i); } void main(){ waiting=0; int res; pthread_t thread[N]; void *thread_result; res = sem_init(&mutex,0,1); if(res!=0){ perror("Erro na inicialização do semaforo!"); exit(EXIT_FAILURE); } res = sem_init(&customers,0,0); if(res!=0){ perror("Erro na inicialização do semaforo!"); exit(EXIT_FAILURE); } res = sem_init(&barbers,0,0); if(res!=0){ perror("Erro na inicialização do semaforo!"); exit(EXIT_FAILURE); } res = pthread_create(&thread[0],NULL,barber,NULL); if(res!=0){ perror("Erro na inicialização da thread!"); exit(EXIT_FAILURE); } for(i=1; i<N; i++){ res = pthread_create(&thread[i],NULL,customer,&i); if(res!=0){ perror("Erro na inicialização da thread!"); exit(EXIT_FAILURE); } } for(i=0; i<N; i++){ res = pthread_join(thread[i],&thread_result); if(res!=0){ perror("Erro ao fazer join nas threads!"); exit(EXIT_FAILURE); } } }
Como pode ser visto, foram usadas threads para representar o barbeiro e os clientes e semaforos para representar o número de barbeiros a espera de clientes e o número de clientes esperando. O que vale salientar é que, para o bom (e lógico) funcionamento do programa, foi colocado uma espera quando o barbeiro está cortando o cabelo de um cliente (para que ele não corte rápido demais pelo processamento do programa e não dê tempo de clientes chegarem e saírem).
Teste
Foi feito um teste com 5 cadeiras, 1 barbeiro e 60 clientes. A figura que mostra a execução do programa pode ser vista abaixo.
Dificuldades
Não houve dificuldades para fazer este problema.