Practico 4 - Ej. 7

Practico 4 - Ej. 7

de Raul Ernesto Rivarola Cuadrado -
Número de respuestas: 0

Hola, queriamos consultarles si les parece correcta esta solucion. Intentamos validar los diferentes flujos posibles, y creemos que es una solución correcta. Nos gustaría saber que opinan. Desde ya gracias.


PROGRAM Principal()
VAR
MV,MB: Semaforo //Mutex vehiculos y Barcos
levantarPuente, bajarPuente : Semaforo
puente_alto: Semaforo; // SEMAFORO NUEVO.
E: Semaforo //Representa region crítica
try: //Maneja intento de paso de los autos, como el de los lectores
cantVehiculos, cantBarcos =0;
puente_quire_subir:Boolean;

PROCEDURE Vehiculo()
{
while(true)
{
P(try);
P(MV);
cantVehiculos++;
if(cantVehiculos==1)
P(E); //Me quedo con la región critica (PUENTE)
V(MV);
V(try);

CruzarPuente();

P(MV);
cantVehiculos--;
If(cantVehiculos==0){
            if(puente_quire_subir){
                V(VehiculosTerminaron); // Uso el valor booleano para que funcione para semaforos de conteo tambien.
            }
            V(E); // libero la zona critica.
        }
V(MV);
}
}

PROCEDURE Barco()
{
while(true)
{
P(MB);
cantBarcos++;
if(cantBarcos==1){
P(try); //Bloqueo a todos los autos que quieran entrar, pero los que ya estan adentro van a cruzar.
V(levantarPuente); //Pido que levanten el puente
            P(puente_alto);// AGREGUE ESTO: Me quedo esperando a que el puente este alto.
}
V(MB);

P(E); //Me quedo
CruzarBarco();
V(E);

P(MB);
cantBarcos--;
If(cantBarcos==0)
V(bajarPuente);//Aviso al puente que baje el puente
V(MB);
}
}

PROCEDURE Puente()
{
while(true)
{
P(levantarPuente);
        P(mV);
        if(cantVehiculos>0){
            puente_quire_subir = true;
            V(mV);
            P(VehiculosTerminaron);// Si aun hay autos espero a que salgan.
            puente_quire_subir = false;// puedo modificarla de forma segura, porque no hay autos que pregunten por ella.
        }
levantarPuente();
        V(puente_alto);

P(bajarPuente);
BajoPuente();
V(try);
}
}


BEGIN

INIT(E,1);

INIT(try,1);
    INIT(MB,1);
    INIT(MV,1);

    INIT(levantarPuente,0);
    INIT(puente_alto,0);
    INIT(bajarPuente,0);


    COBGEIN
        Puente();
        Auto();
        Barco();
    COEND
    
END