Práctica 04 - ProgProcesosYServicios/Practicas-2 GitHub Wiki
Práctica 2.4: Exclusión mutua: el algoritmo de Dekker (segundo intento)
El primer intento sufría de inanición en ausencia de contención) pues una hebra podría estar esperando su turno para entrar en la sección crítica incluso aunque la otra no esté dentro.
La siguiente propuesta es no guardar el turno, sino si una hebra ha entrado en la sección crítica o no. Antes de entrar) una hebra mira si la opuesta esta ya dentro. Si lo está, espera hasta que salga, y entra cuando lo haga.
En lugar de un único entero _turno
, ahora necesitamos un booleana para cada una de las dos hebras.
-
Copia el proyecto de la práctica anterior, y renombra la clase principal a Dekker2.
-
Modifica el código relacionado con la exclusión mutua:
protected void entradaSeccionCritica(int numHebra) {
int otraHebra = numHebra ^ 0x1;
while(_enSeccionCritica[otraHebra].valor)
Thread.yield();
// ¡Está libre!
_enSeccionCritica[numHebra].valor = true;
} // entradaSeccionCritica
protected void salidaSeccionCritica(int numHebra) {
_enSeccionCritica[numHebra].valor = false;
} // salidaSeccionCritica
class Flag {
public volatile boolean valor = false;
} // class Flag
protected Flag[] _enSeccionCritica; // Inicialización en el constructor
- Crea el constructor de la clase para inicializar
_enSeccionCritica
. Hemos necesitado crear la clase internaFlag
porque un array volatil hace volátil la referencia al array, no los elementos que contiene, que es lo que nosotros necesitamos. - Ejecuta el programa.
[carpeta bin del proyecto]java p04.Dekker2
¿Funciona? - Ejecutalo en monoprocesador (con
taskset
en linux ostart /affinity 0x1
en windows ). ¿Funciona ahora? - Eres capaz de explicar lo que ocurre?