Está en la página 1de 2

Peluquero dormiln

Introduccin
Una ciudad tiene una peluquera con dos puertas y unas pocas sillas. Los clientes
entran por una puerta y salen por la otra. Dado que el negocio es chico, a lo su
mo un cliente o el peluquero se pueden mover en l a la vez. El peluquero pasa su
vida atendiendo clientes, uno por vez. Cuando no hay ninguno, el peluquero duerm
e en su silla. Cuando llega un cliente y encuentra que el peluquero est durmiendo
, el cliente lo despierta, se sienta en la silla del peluquero y duerme mientras
el peluquero le corta el pelo. Si el peluquero est ocupado cuando llega un clien
te, el cliente se va a dormir a una de las otras sillas. Despides de un corte de
pelo, el peluquero abre la puerta de salida para el cliente y la cierra cuando
el cliente se va. Si hay clientes esperando, el peluquero despierta a uno y espe
ra que el cliente se siente. Sino, se vuelve a dormir hasta que llegue un client
e.
Implementacin
La implementacin propuesta esta desarrollada en C usando semforos.
Semforos:
Clientes (customers): nmero de clientes en espera sin contar el que se esta corta
ndo el pelo
Barberos (barber): nmero de peluqueros (barberos) inactivos.
Exmut: exclusin mutua.
Condiciones iniciales: customers = 0, barber = 0, exmut = 1
Cdigo
acceso al posix es para las llamadas al sistema funciones de contenedor que se
debe de encontar en las distribuciones unix
#include <stdio.h>
#include <unistd.h>
#include <pthread.h>

#define TRUE 1
#define FALSE 0
#define CHAIRS 3 //Sillas Disponibles
#define CANT_CUST 5 //Cantidad de Clientes
#define T_CUST 0 //Tiempo de llegada de Clientes
#define T_CORTE 3 //Tiempo de corte de pelo

typedef int semaphore;

//Prototipo de funciones
void *customer (void *);
void *barber (void *);
void up (semaphore *);
void down (semaphore *);

semaphore sem_barber=0, sem_customer=0,sem_mutex=1;
int waiting=0;

//Main function
int main (void) {
pthread_t barb_t,cust_t[CANT_CUST];
int i;

pthread_create(&barb_t,NULL,barber,NULL);
for (i=0;i<CANT_CUST;i++){
sleep(T_CUST);
pthread_create(&cust_t[i],NULL,customer,NULL);
}

pthread_join(barb_t,NULL);
return(0);
}

void *customer (void *n) {
printf ("Customer:entrando hay %d esperando\n",waiting);
down (&sem_mutex);
if (waiting < CHAIRS) {
waiting++;
up (&sem_customer);
up (&sem_mutex);
down (&sem_barber);
printf ("Customer:Me estan cortando el pelo.\n");
}
else {
up (&sem_mutex);
printf ("Customer:Me fui no hay lugar.\n");
}
}

void *barber (void *j) {
printf ("Barber:Empiezo a trabajar\n");
while (TRUE) {
down (&sem_customer);
down (&sem_mutex);
waiting--;
up (&sem_barber);
up (&sem_mutex);
printf ("Barber:Comienzo el corte de pelo de un cliente quedan %d esperando.\n
",waiting);
sleep (T_CORTE);
printf ("Barber:Termine de cortar el pelo de un cliente quedan %d esperando.\n
",waiting);
}
}

void up (semaphore *sem) {
*sem+=1;
}

void down (semaphore *sem) {
while (*sem<=0){};
*sem-=1;
}
/////////////////////////////////////////////////////////
-para compilar
$test gcc barbero.c -lpthread
-para ejecutar
./a.out
-descragar compilador GCC
yum install gcc-c++

También podría gustarte