Práctica 11 - ProgProcesosYServicios/Practicas-2 GitHub Wiki
Práctica 2.11: Quitando la espera activa en Test and Set
En la práctica 2.9 intentábamos quitar la espera activa a la solución de Peterson, aunque sin éxito debido al problema del resume() perdido. También podemos intentarlo con la solución de la práctica 2.10. En ese caso las hebras ya no se conocen entre sí; lo que haremos será tener un nuevo atributo en el que las hebras guardarán para anotar que se han suspendido para que la otra la despierte. Una solución general (para más de dos hebras) utilizaría un conjunto (o una cola).
1.- Haz una copia del proyecto de la práctica 2.10.
2.- Añade un atributo nuevo, protected Thread _waitingThread;
3.-Modifica el método entradaSeccionCritica()
para que si testAndSet()
devuelve falso, la hebra guarde una referencia a sí misma en el nuevo atributo y se suspenda
4.- Modifica el método salidaSeccionCritica()
para que después de poner 0 al cerrojo se mire si hay alguna hebra esperando y, si es así, se despierte y se elimine su referencia.
protected void entradaSeccionCritica() {
while(!testAndSet())
{
_waitingThread = Thread.currentThread();
Thread.currentThread().suspend();
}
} // entradaSeccionCritica
/**
* "Postprotocolo" para indicar que la hebra ha terminado
* el uso del recurso compartido que debe ser usado en
* exclusión mútua y que abandona por tanto la sección crítica.
*/
protected void salidaSeccionCritica() {
_cerrojo.set(0);
Thread wt = _waitingThread;
if (wt != null){
_waitingThread = null;
wt.resume();
}
} // salidaSeccionCritica
5.- Ejecuta el programa usando varios procesadores y usando sólo uno. ¿Funciona?¿Por qué?
6.- Usando jps
y jstack
comprueba el estado de las hebras.