- 1 Problema de la barbería
- 2 Características del problema
- 3 Restricciones
- 4 Semáforos utilizados
- 5 Ejemplo en pseudocódigo
- 6 Entrega
1 Problema de la barbería
Implementa el problema de la barbería usando hilos, cerrojos y
semáforos anónimos POSIX (nuevamente el código del programa
buffer-circular-hilos.c
visto en el tema 4 de teoría te puede servir
de apoyo).
2 Características del problema
- Hay tres barberos y tres sillas de barbero
- La sala de espera tiene un sofá de cuatro plazas
- Hay una sala de espera de pie
- Hay una caja para cobrar
3 Restricciones
- Si la barbería está llena no pueden entrar más clientes, la capacidad es de 20 clientes.
- Al entrar los clientes toman asiento en el sofá o se quedan de pie.
- Cuando un barbero queda libre coge al cliente que lleva más tiempo esperando en el sofá y el cliente que está de pie que lleve más tiempo toma asiento en el sofá.
- Al finalizar el corte de pelo cualquier barbero puede aceptar el pago, pero debido a que solamente hay una caja registradora, sólo acepta el pago de un cliente cada vez.
- Los barberos dividen su tiempo entre cortar el pelo, aceptar pagos y dormir en su silla esperando clientes.
- La barbería cerrará cuando no queden más clientes que atender.
4 Semáforos utilizados
max_capacidad
:- controla la capacidad de clientes que tiene la barbería. Inicializado a 20.
sofa
:- controla el uso del sofá de los clientes. Inicializado a 4.
silla_barbero
:- controla las sillas que usan los barberos para cortar el pelo. Inicializado a 3.
cliente_listo
:- este semáforo sirve para indicar que el cliente ya esta sentado en la silla.
terminado
:- indica que el corte de pelo ha terminado. Inicializado a 0.
dejar_silla_barbero
:- usado cuando el cliente abandona la silla después del corte de pelo. Inicializado a 0.
pago
:- controla el pago de los clientes. Inicializado a 0.
recibo
:- entrega al cliente de un recibo de pago, indica que se ha aceptado el pago. Inicializado a 0.
coord
:- controla la ocupación de los barberos, tanto para cortar el pelo como para cobrar. Inicializado a 3.
5 Ejemplo en pseudocódigo
def thread_barbero():
while True:
wait(cliente_listo)
wait(coord)
cortar_pelo()
signal(coord)
signal(terminado)
wait(dejar_silla_barbero)
signal(silla_barbero)
def thread_cajero():
while True:
wait(pago)
wait(coord)
cobrar()
signal(coord)
signal(recibo)
def thread_cliente():
while True:
wait(max_capacidad)
entrar_barberia()
wait(sofa)
sentarse_sofa()
wait(silla_barbero)
levantarse_sofa()
signal(sofa)
sentarse_silla_barbero();
signal(cliente_listo);
wait(terminado);
levantarse_silla_barbero();
signal(dejar_silla_barbero);
pagar();
signal(pago);
wait(recibo);
salir_tienda();
signal(max_capacidad);
6 Entrega
-
Se realiza en pracdlsi en las fechas allí indicadas. Puedes entregar tantas veces como quieras, solo se corrige la ultima entrega.
-
Los documentos que entregues que sean de texto (UTF-8 preferiblemente) o PDF, no emplees otros formatos.
-
Crea una carpeta llamada
p7
y dentro de ella estarán el código y archivos de texto o PDF donde contestas a las preguntas. Esta carpeta la comprimes en un archivo llamadop7.tgz
p.e. así usando el terminal:tar cfz p7.tgz p7