Problema do Barbeiro Sonolento
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.

barbeiro.jpg

Dificuldades

Não houve dificuldades para fazer este problema.

Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-ShareAlike 3.0 License