//Variables Globales Integer contAutosEnPuente,contAutosEsperando,contBarcosEnPuente,contBarcosEsperando; Shemaphore contAutosEnPuenteS,contAutosEsperandoS,contBarcosEnPuenteS,contBarcosEsperandoS,auto_entrada,barco_entrada; //Auto Procedure Auto{ //consultamos si hay barcos esperando o barcos en el puente P(contBarcosEnPuenteS); P(contBarcosEsperandoS); if (contBarcosEnPuente>0 || contBarcosEsperando>0){ //El ultimo barco nos va a avisar (vamos a hacer X cantidad de "P(auto_entrada)" donde X = contAutosEsperando), pero para eso marcamos como que somos un auato esperando P(contAutosEsperandoS); contAutosEsperando ++; V(contAutosEsperandoS); //desbloqueamos la zona de mutuo esclusion para que puedan salir o entrar barcos V(contBarcosEnPuenteS); V(contBarcosEsperandoS); //nos quedamos esperando a que el ultimo barco nos habilite a pasar () P(auto_entrada); // cuando nos habilita el cruce el ultimo barco podria pasar que llegue otro barco, llamemosle "BarcoMolesto" que tendria que ejecutar y finalmente no podamos ejecutrar el auto_entrada // (no tenemos los P(contBarcosEsperandoS) y P(contBarcosEsperandoS)) que nos aseguren que no llegaran mas barcos al momento del desbloqueo. P(contBarcosEnPuenteS); P(contBarcosEsperandoS); while ((contBarcosEnPuente>0 || contBarcosEsperando>0)){ V(contBarcosEnPuenteS); V(contBarcosEsperandoS); P(auto_entrada); // esperamos la señal del nuevo barco (el "BarcoMolesto" o un barco molesto posterior al primero) que nos despertara nuevamente P(contBarcosEnPuenteS); P(contBarcosEsperandoS); } // en este punto tenemos los bloqueos aseguran que no hay barcos esperando ni en el puente P(contAutosEnPuenteS); P(contAutosEsperandoS); contAutosEnPuente++; contAutosEsperando--; V(contAutosEnPuenteS); V(contAutosEsperandoS); V(contBarcosEnPuenteS); // liberamos la entrada de barcos V(contBarcosEsperandoS); }else{ //nos metemos en el puente porque no hay ni barcos esperando ni un barco en el puete P(contAutosEnPuenteS); contAutosEnPuente++; V(contAutosEnPuenteS); //desbloqueamos la zona de mutuo esclusion para que puedan entrar barcos en espera (Los barcos tienen prioridad respecto a los autos) V(contBarcosEnPuenteS); V(contBarcosEsperandoS); } delay(X); //realizamos el cruce //al salir del puente tenemos que verificar si somos el ultimo auto que estaba en el puente: // 1- si no lo somos no hacemos nada // 2- si lo somos tenemos que hacer un V(barco_entrada) si hay barcos esperando P(contAutosEnPuenteS); contAutosEnPuente--; if(contAutosEnPuente == 0){ P(contBarcosEsperandoS); if(contBarcosEsperando > 0){ V(barco_entrada); } V(contBarcosEsperandoS); } V(contAutosEnPuenteS); } //Barco Procedure barco{ //consultamos si hay barcos en el puente P(contBarcosEnPuenteS); P(contBarcosEsperandoS);// hay que incluir este chequeo por si entra un barco mientras sale el ultimo auto P(contAutosEnPuenteS);// hay que pedirlo despues de los otros dos P para no generar deadlock con el auto if (contAutosEnPuente>0 || contBarcosEnPuente>0 || contBarcosEsperando>0){ //El ultimo auto nos va a avisar (o cuando salga el barco) pero hay que marcar como que somos un barco esperando contBarcosEsperando++; //desbloqueamos la zona de mutuo esclusion para que puedan salir autos V(contBarcosEnPuenteS); V(contBarcosEsperandoS); V(contAutosEnPuenteS); P(barco_entrada);// esperamos la señal del ultimo auto o el barco que estaba en el puente P(contBarcosEnPuenteS); P(contBarcosEsperandoS); contBarcosEnPuente++; contBarcosEsperando--; V(contBarcosEnPuenteS); V(contBarcosEsperandoS); }else{ contBarcosEnPuente++; V(contBarcosEnPuenteS); V(contBarcosEsperandoS); V(contAutosEnPuenteS); } delay(Y); //realizamos el cruce del barco //al salir del puente tenemos que verificar si somos el ultimo barco que salio del puente: // 1- si no lo somos tenemos que desperat al proximo barco si hay esperando V(barco_entrada) (solo 1 V) // 2- si lo somos tenemos que hacer un V(auto_entrada) por cada auto que este esperando. P(contBarcosEnPuenteS); P(contBarcosEsperandoS); contBarcosEnPuente--; if (contBarcosEsperando>0){ //despertamos al proximo barco V(barco_entrada); } else { P(contAutosEsperandoS);// evitamos que entren mas autos en espera para hacer la cantidad de V correctos for (int i=0; i