Documente Academic
Documente Profesional
Documente Cultură
int cerrojo = 0; /* Inicializamos la variable cerrojo. Esto sería sólo válido para
hilos, ya que los procesos no comparten espacio de memoria. La
variable se inicializa FUERA de los hilos.
Del while en adelante, ya es código perteneciente a los hilos
en ejecución. */
Sin embargo, esto es problemático: Supongamos que tenemos únicamente un proceso con dos
hilos (Hx y Hy) y el planificador retira el hilo Hx justo antes de ejecutarse la instrucción cerrojo =
1;. El hilo Hy ejecuta su código, entra en la sección crítica (Esto puede ocurrir ya que cerrojo
sigue a 0) y el planificador le retira el uso del procesador dentro de ésta. A continuación, se le
vuelve a asignar el procesador a Hx.
De esta forma, tenemos a dos hilos ejecutando código de la sección crítica. Para evitar este
problema, debemos implementar los protocolos de entrada y salida de forma que se ejecuten en
una sola instrucción, con lo cual o el planificador retira el uso del procesador antes de esta
instrucción, o sino lo retira después de haberla ejecutado.
Este algoritmo utiliza un flag.
Al entrar a la sección crítica se fija si es uno o cero si es cero lo pone en uno y entra a
la sección crítica; si es uno espera hasta que valga cero. Antes de salir de la sección
crítica iguala el flag a cero.
Repeat
If (flag = 0) then {
Flag:=1
Seccion crítica
Flag:=0
Seccion no crítica}
Until 0 = 1