Peluquero dormilon
El problema del peluquero dormilón (originalmente, el barbero dormilón) es un clásico de la Programación Concurrente. En él se propone la discusión sobre cómogestionar el ``transito'' por una pequeña peluquería (recurso compartido), por parte de dos tipos de procesos: el peluquero y los clientes. El enunciado sugiere que durante la ejecución lainteracción entre el peluquero y un cliente se puede producir muy a menudo y que, por tanto, deben establecerse los mecanismos de sincronización adecuados para evitar que los dos ``colisionen'' dentro lapeluquería; es decir, asegurar uno sólo es el que se mueve en cada momento.
Etapa 1.
A continuación se presenta una primera solución del problema, describiendo, mediante seudocódigo, la actividad delos procesos.
MODULE PeluqueroDormilon;
CONST
NumClientes = 6;
VAR
I : [1..NumClientes];
TASK Peluquero;
BEGIN
LOOP
>
>
>
END (* LOOP *)
END Peluquero;TASK Cliente;
BEGIN
>
IF NOT > THEN
>
ELSE
>
>
>
END (* IF *)
END Cliente;
BEGIN
COBEGIN
Peluquero;
FORALL I:= 1 TO NumClientes DO
ClienteEND; (* FORALL *)
COEND
END PeluqueroDormilon.
Etapa 2.
Vamos a detectar en la especificación anterior los puntos de sincronización entre los procesos, asociándoles una operación de monitor.MODULE PeluqueroDormilon;
.........................
MONITOR Peluqueria;
PUBLIC
EsperarCliente,
PedirCorteDePelo,
FinalCorteDePelo,
AbrirPuertaEsperarSalida,ClienteSale;
PROCEDURE EsperarCliente;
BEGIN
IF > THEN
>
ELSE
>
END (* IF *)
END EsperarCliente;
PROCEDURE PedirCorteDePelo (VAR meAtienden : BOOLEAN);
BEGIN
meAtienden := TRUE;IF > AND
NOT > THEN
meAtienden := FALSE
ELSIF > THEN
>
ELSE
>
END (* IF *)
END PedirCorteDePelo;
PROCEDURE FinalCorteDePelo;
BEGIN
>
END FinalCorteDePelo;...
Regístrate para leer el documento completo.