Practico 5, ejercicio 7

Practico 5, ejercicio 7

de Esteban Gabriel Risso Martinez -
Número de respuestas: 1

Buenas, quería saber si mi solución contemplaba todos los puntos que pide el ejercicio. 

- Pueden haber varios vehículos en el puente.

- Los barcos tendrán prioridad para el cruce (Semáforo cruce_auto), debiendo poder hacer el cruce tan pronto como se haya vaciado de vehículos y elevado el puente. 

- Solamente se admitirá el cruce de un único barco a la vez (Semáforo cruce_barco).

- En caso de presentarse cola de barcos, se desea evitar que el puente se eleve y descienda para cada uno de ellos (puente_elevado).

Dejo mi solución:

procedure auto {                                procedure barco {

begin                                                  begin

P(cruce_auto);                                   P(S2);

   P(S1);                                              cant_barcos ++;

   cant_autos ++;                              V(S2);

   V(S1);                                                if(cant_autos == 0) then {

   Cruce auto;                                     P(cruce_barco);

   P(S1);                                             if(not puente_elevado) then {

   cant_autos --;                                           elevar_puente(true);

   V(S1);                                           puente_elevado:= true;

   V(cruce_auto);                             }

end                                                     Cruce barco;

}                                                     P(S2);

                                                    cant_barcos --;

                                                    if(cant_barcos == 0) then {

                                                 if(puente_elevado) {

                                              elevar_puente(false);

                                              puente_elevado:= false;

                                                      V(cruce_auto);

                                                 }

                                                    }

                                                    V(S2);

                                                    V(cruce_barco);

                                                     }

                                                          end

                                                          }

begin

init(S1,1);

init(S2,1);

init(cruce_auto,1);

init(cruce_barco,1);

int cant_autos = 0;

int cant_barcos = 0;

COBEGIN

auto;

...

auto;

barco;

...

barco;

COEND

end


Gracias, saludos.

En respuesta a Esteban Gabriel Risso Martinez

Re: Practico 5, ejercicio 7

de Javier Agustin Sanchez Burgos -

Buenas Esteban,

Creo que necesitas mutuo excluir cuando consultas en los ifs por cant_barcos y cant_autos en barco, imagina que la operacion ++ se haga en tres instrucciones de bajo nivel como en el ejemplo del teórico. Por ejemplo, llega un auto y un barco en ese orden, justo cuando el auto llega a cant_autos++ pierde la Cpu y la toma barco que pregunta en el if y ve que cant_autos=0. Si el puente no estaba elevado, sera elevado con el auto pasando. En caso contrario el auto choca contra el puente.

Saludos,
Agustin Sanchez.