Práctica 08 - ProgProcesosYServicios/Practicas-2 GitHub Wiki
Práctica 2.8: Exclusión mutua: el algoritmo de Peterson
La solución final de Dekker, que data de la primera mitad de la década de 1960, puede hacer sufrir a alguna de las hebras inanición en presencia de contención) debido a que el turno se utiliza únicamente en caso de conflicto. Imagina que la hebra 0 tiene el turno y ocupa la sección crítica. Mientras tanto, la hebra 1 intenta hacer lo mismo, pero se queda en la espera activa del bucle interno (línea 10) a la espera de que la hebra 0 le devuelva el turno.
Si en este punto la hebra 0 termina, cambiará el turno convenientemente; pero podría ocurrir que, antes de que la hebra 1 tenga Oportunidad de continuar y mostrar su intención de entrar en la sección crítica (línea 12), la hebra 0 vuelva a intentar entrar en la sección crítica. En ese caso, verá que la otra no ha mostrado su interés por hacer lo mismo (y aprovechar su turno) y volverá a entrar ella.
En 1981 Peterson proporcionó un algoritmo que resuelve este problema y que, de hecho, es más sencillo que el de Dekker. Utiliza también las dos banderas y el turno. Pero ahora una hebra nunca anula su intención de entrar en la sección crítica una vez que lo ha pedido.
1.- Haz una copia del proyecto de la práctica anterior.
2.- Sustituye el código de los métodos de entrada y salida de la sección crítica.
protected void entradaSeccionCritica(int numHebra) {
_enSeccionCritica[numHebra].valor = true;
int otraHebra = numHebra ^ 0x1;
_turno = otraHebra;
while(_enSeccionCritica[otraHebra].valor &&
(_turno == otraHebra))
;
// ¡Está libre!
} // entradaSeccionCritica
protected void salidaSeccionCritica(int numHebra) {
_enSeccionCritica[numHebra].valor = false;
} // salidaSeccionCritica
3.- Comprueba que funciona