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 llamado p7.tgz p.e. así usando el terminal:

    tar cfz p7.tgz p7