Ejercicio 1 - (Piscina con Monitores)

Ejercicio 1 - (Piscina con Monitores)

de Romina Hoffman Giorello -
Número de respuestas: 0

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.