Problema del lavabo unisex
Una oficina tiene en su quinta planta un único lavabo que es
unisex. Para el funcionamiento correcto de este lavabo los empleados han de cumplir las
siguientes reglas:
• En el lavabo no puede haber hombres y mujeres a la vez.
• La capacidad máxima es de 3 personas.
Escribe el pseudocódigo de los procesos Hombre() y Mujer() para que se garanticen estas
dos condiciones en el acceso al lavabo mediante semáforos.
semáforos:
mutex_hombre(1); //inicializados a 1(abierto)
mutex_mujer(1);
lavabo(1);
h_aforo(3); //capacidad máxima (3)
m_aforo(3);
esperando(1);
int contador_hombres=0;
int contador_mujeres=0;
hombre()
{
while(true){
wait(esperando); //espera aviso para entrar
wait(mutex_hombre); //espera aviso de paso para hombres
contador_hombres++; //incrementamos numero de hombres
if(contador_hombres==1)
wait(lavabo); //espera para usar el lavabo
signal(mutex_hombre); //avisa para permitir el paso a hombres
signal(esperando); //da el aviso para entrar
wait(h_aforo); //espera a que haya hueco y entra al lavabo
//usa lavabo
signal(h_aforo); //libera el hueco
wait(mutex_hombre); //espera aviso de paso para hombres
contador_hombres--;
if(contador_hombres==0) //si no hay hombres
signal(lavabo); //avisa que lavabo esta libre
signal(mutex_hombre) // avisa para permitir el paso a hombres
}
}
wait(esperando); //espera aviso para entrar
wait(mutex_hombre); //espera aviso de paso para hombres
contador_hombres++; //incrementamos numero de hombres
if(contador_hombres==1)
wait(lavabo); //espera para usar el lavabo
signal(mutex_hombre); //avisa para permitir el paso a hombres
signal(esperando); //da el aviso para entrar
wait(h_aforo); //espera a que haya hueco y entra al lavabo
//usa lavabo
signal(h_aforo); //libera el hueco
wait(mutex_hombre); //espera aviso de paso para hombres
contador_hombres--;
if(contador_hombres==0) //si no hay hombres
signal(lavabo); //avisa que lavabo esta libre
signal(mutex_hombre) // avisa para permitir el paso a hombres
}
}
mujer()
{
while(true){
wait(esperando);
wait(mutex_mujer);
contador_mujeres++;
if(contador_mujers==1)
wait(lavabo);
signal(mutex_mujer);
signal(esperando);
wait(h_aforo);
//usa lavabo
signal(h_aforo);
wait(mutex_mujer);
contador_mujeres--;
if(contador_mujers==0)
signal(lavabo);
signal(mutex_mujer)
}
}
while(true){
wait(esperando);
wait(mutex_mujer);
contador_mujeres++;
if(contador_mujers==1)
wait(lavabo);
signal(mutex_mujer);
signal(esperando);
wait(h_aforo);
//usa lavabo
signal(h_aforo);
wait(mutex_mujer);
contador_mujeres--;
if(contador_mujers==0)
signal(lavabo);
signal(mutex_mujer)
}
}
A ver ese if...
ResponderEliminar