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