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?