procedure Barco(){ puente.llega_barco() cruzar() puente.sale_barco() } procedure Vehiculo(){ puente.llega_vehiculo() cruzar() puente.sale_vehiculo() } monitor puente(){ int contador_vehiculos int contador_barcos bool hay_barco condition pasaje_barco condition pasaje_vehiculo procedure llega_barco(){ hay_barco = true if(contador_vehiculos > 0 || contador_barcos > 0) pasaje_barco.wait() if(contador_barcos == 0) levantar_puente() contador_barcos++ } procedure sale_barco(){ contador_barcos-- pasaje_barco.signal() if(contador_barcos == 0){ hay_barco = false pasaje_vehiculo.signal() bajar_puente() } } procedure llega_vehiculo(){ contador_vehiculos++ if(hay_barco) pasaje_vehiculo.wait() } procedure sale_vehiculo(){ contador_vehiculos-- if(hay_barco && contador_vehiculos == 0) pasaje_barco.signal() } }