Buenas,
Me gustaría saber si la siguiente solución para el Ejercicio 1 es correcta:
monitor Piscina
VAR flotadores_disponibles: integer;
nadadores_profesionales: integer;
nadadores_amateurs: integer;
max_profesionales: integer;
cond_profesionales : condition;
cond_amateurs : condition;
cond_flotadores : condition;
procedure ENTRY iniciar
begin
flotadores_disponibles := 30
nadadores_profesionales := 0
nadadores_amateurs := 0
max_profesionales := 10
end
procedure ENTRY nadador_profesional
begin
if nadadores_amateurs > 0 or nadadores_profesionales >= max_profesionales then
cond_profesionales.wait()
end if
nadadores_profesionales := nadadores_profesionales + 1;
nadar();
nadadores_profesionales := nadadores_profesionales - 1;
if nadadores_profesionales = 0 then
cond_amateurs.signal() // Permite la entrada de amateurs si no hay más profesionales
else
cond_profesionales.signal() // Permite la entrada de otro profesional
end if
end
procedure ENTRY nadador_amateur(necesita_dos_flotadores: boolean)
begin
if nadadores_profesionales > 0 then
cond_amateurs.wait()
end if
var flotadores_necesarios: integer
flotadores_necesarios := if necesita_dos_flotadores then 2 else 1
while flotadores_disponibles < flotadores_necesarios do
cond_flotadores.wait()
end while
flotadores_disponibles := flotadores_disponibles - flotadores_necesarios
nadadores_amateurs := nadadores_amateurs + 1
nadar();
flotadores_disponibles := flotadores_disponibles + flotadores_necesarios
nadadores_amateurs := nadadores_amateurs - 1
if nadadores_amateurs = 0 then
cond_profesionales.signal() // Permite la entrada de profesionales si no quedan amateurs
else
cond_amateurs.signal() // Permite la entrada del siguiente amateur
end if
cond_flotadores.signal() // Notifica que hay flotadores disponibles
end
end monitor
var piscina: Piscina
begin
piscina.iniciar
cobegin
piscina.nadador_profesional()
...
piscina.nadador_profesional()
piscina.nadador_amateur(true);
...
piscina.nadador_amateur(false);
coend
end
Muchas gracias.