Práctica 05 - ProgProcesosYServicios/Practicas-2 GitHub Wiki
Práctica 2.5: Exclusión mutua: el algoritmo de Dekker (tercer intento)
El intento de la práctica anterior no garantizaba la exclusión mutua. En entradaSeccionCritíca(int)
hay un punto débil en la línea 6 del código, justo cuando salimos del bucle de la espera activa y antes de avisar de que
vamos a entrar en la sección crítica nosotros. La otra hebra podría estar en ese momento comprobando precisamente lo mismo, viendo que nosotros no estamos dentro, y entrando ella también.
La solución intuitiva es que una hebra primero active su bandera, y luego haga espera activa sobre la bandera de la otra hebra. De esa forma solucionamos la exclusión mutua porque en cuanto salimos de la espera activa la sección crítica es para nosotros al haberla “bloqueado” previamente.
Haz una copia del proyecto de la práctica anterior, y renombra la clase a Dekker3.
- Modifica el método
entradaSeccionCrítica(int)
:
protected void entradaSeccionCritica(int numHebra) {
//Simulamos que estamos dentro
_enSeccionCritica[otraHebra].valor = true;
int otraHebra = numHebra ^ 0x1;
while(_enSeccionCritica[otraHebra].valor)
Thread.yield();
// ¡Está libre!
} // entradaSeccionCritica
- Ejecuta el programa
java p05.Dekker3
¿Funciona? - Ejecutalo en monoprocesador (con
taskset
en Linux o start /affinity 0x1 en Windows ). ¿Funciona ahora? - Eres capaz de explicar lo que ocurre?