quinta-feira, 7 de maio de 2009

Barbeiro Dorminhoco


O problema é análogo ao de manter um barbeiro trabalhando quando existem clientes, descansando quando há nenhum e fazendo tudo isso de uma forma ordenada. O barbeiro e seus clientes podem ser representados por seus referidos processos.
A seguir, um trecho em C que pode resolver mais esse problema. O problema foi ligeiramente simplificado:
  • Supondo que apenas 25 clientes chegaram em intervalos regulares de um segundo;
  • Supondo que o barbeiro leva dois segundos para fazer um corte;
  • Supondo que a barbearia tem cinco cadeiras para os clientes aguardarem a vez, como ilustra a figura ao lado.
Considerando o que foi levantado, o trecho abaixo pode solucionar o problema enunciado:

#include<semaphore.h>
#include<pthread.h>

#include<math.h>
#include<stdio.h>
#include<time.h>
#include<stdlib.h>

#define CHAIRS 5

#define NUMBER_CUSTOMERS 25

#define TRUE 1
#define FALSE 0

#define NEW_CUSTOMER 1 //time between the arrival of two customers
#define HAIRCUT_TIME 2 //time to finish a haircut

sem_t customers, barbers, mutex;

int
waiting = 0;

void
cut_hair(){
printf("Barber is working!! %d free chair(s)\n", CHAIRS-waiting);
}


void
get_haircut(int i){
printf("Customer #%d is getting a haircut!\n", i);
}


void
barber(void){
while
(TRUE){
sem_wait(&customers);

sem_wait(&mutex);
waiting--;
sem_post(&mutex);
sem_post(&barbers);

cut_hair();
sleep(HAIRCUT_TIME);
}
}


void
customer(int i){

sem_wait(&mutex);
if
(waiting<CHAIRS) {
waiting++;

sem_post(&customers);
sem_post(&mutex);
sem_wait(&barbers);

get_haircut(i);
}

else
{
sem_post(&mutex);

printf("Barber shop is full! Customer #%d cannot wait!\n", i);
}
}


void
* call_barber(void* arg){

barber();
}


void
* call_new_customer(void* arg){
customer( (int) arg);
}


int
main() {
int
i;
sem_init(&customers, 0, 0);

sem_init(&barbers, 0, 1);
sem_init(&mutex, 0, 1);

pthread_t mr_barber;
pthread_create(&mr_barber, NULL, call_barber, NULL);

pthread_t customer[NUMBER_CUSTOMERS];

for
(i=0; i<NUMBER_CUSTOMERS; i++) {

printf("Customer #%d arrives! %d free chair(s)\n", i, CHAIRS-waiting);
pthread_create(&customer[i], NULL, call_new_customer, (void*) i);

sleep(NEW_CUSTOMER);
}


return
0;
}
A seguir, um screenshot para comprovar o bom funcionamento do programa desenvolvido.


Nenhum comentário:

Postar um comentário