Practico 5 ejercicio 7 ¿Semaforos binarios o no binarios?

Re: Practico 5 ejercicio 7 ¿Semaforos binarios o no binarios?

de Juan Ramirez -
Número de respuestas: 0
Creo que se puede simplificar bastante con respecto a las soluciones que han planteado.
Se pueder visualizar mejor cuando se tiene en cuenta solo lo siguiente:
* Barcos tiene prioridad
* Puede haber varios barcos/autos pasando a la vez
Entonces, podemos separar en 4 metodos:
entra_auto()
sale_auto()
entra_barco()
sale_barco()
Empezemos por entra_barco():
entra_barco()
____P(seccion_critica)
____barcos += 1 // ultimate trick
____P(barco_entrada)
____while autos > 0
________V(seccion_critica)
________P(auto_salida)
________P(seccion_critica)
____end
____if barcos == 1
________subir_puente()
____end
____V(barco_entrada)
____V(seccion_critica)
end
Seguimos con entra_auto()
entra_auto()
____P(seccion_critica)
____P(auto_entrada)
____while barcos > 0
________V(seccion_critica)
________P(barco_salida)
________P(seccion_critica)
____end
____autos += 1
____if autos == 1
________bajar_puente()
____end
____V(auto_entrada)
____V(seccion_critica)
end
La diferencia sutil entre ambas funciones es el lugar donde se incrementan las variables BARCOS o AUTOS.
La variable BARCOS se incrementa apenas se agarra la seccion critica, pero la variable AUTOS se incrementa solo cuando es seguro que no hay mas barcos.
Esto permite manejar el tema de las prioridades, pues apenas llegue un barco ya no van a poder pasar mas autos, sin embargo, si van a pasar mas barcos aun cuanod hay autos esperando.
Un par de detalles mas:
* barco_entrada controla que los barcos entre de a uno, lo mismo para auto_entrada
* La espera a que el puente quede libre, tanto para barcos como para autos, se hace siempre dentro de barco_entrada o barco_salida respectivamente
* Los loops liberar y agarran la seccion critica para evitar deadlocks, y hacer que todo lo demás siga funcionando
Dicho esto, los metodos sale_auto() y sale_barco() son casi iguales:
sale_auto()
____P(seccion_critica)
____autos -= 1
____V(seccion_critica)
____V(auto_salida)
end
sale_barco()
____P(seccion_critica)
____barcos -= 1
____V(seccion_critica)
____V(barco_salida)
end
Con estos dos ultimos metodos queda claro que los contadores BARCOS y AUTOS son protejidos por la seccion critica y no por los otros semaforos.