3.4 SINCRONIZACION DE HILOS COMPUTACION

La necesidad de la sincronización de hilos, tiene lugar cuando varios hilos intentan acceder al mismo recurso o dato. Es decir, los hilos necesitan establecer cierto orden, a la hora de acceder a datos comunes. Para asegurarse de que los hilos concurrentes no se estorban y operan correctamente con datos o recursos compartidos, un sistema estable previene la inacición y el punto muerto o interbloqueo. La inanición tiene lugar cuando uno o más hilos están bloqueados al intentar conseguir el acceso a un recurso compartido de ocurrencias limitadas.  El interbloqueo es la última fase de la inanición; ocurre cuando uno omás hilos están esperando una condición que no puede ser satisfecha. Esto ocurre muy frecuentemente cuando dos o más hilos están esperando a que el otro u otros desbloqueen algún dato u objeto común.

   Existen dos forma para aplicar la sincronización:
  • Bloqueo de objetos
  • Uso de señales.
   Bloqueo de objetos.

   Un objeto es bloqueado para indicarle a los demás hilos que estan en ejecución y que pudieran intentar acceder a éste que ya un hilo lo esta utilizando, para esto utilizamos la palabra synchronized en la definición de los métodos que tienen la posibilidad de tener éste problema de sincronización, por ejemplo:

          public synchronized int getNumero();

   De ésta forma, cuando un objeto este ejecutando el método getNumero que utiliza synchronized, se establece un bloqueo en dicho objeto para que ningún otro hilo pueda utilizarlo hasta que termine de ser usado por el hilo actual.

   Uso de semáforos o señales.

   Dentro de éste sistema, un hilo puede detener su ejecución y esperar una señal de otro hilo para continuar con su ejecución.

   En este sistema encontramos varios sistemas como son el uso de mutex, semáforos y barreras.

3.4.1. Mutex.

   También conocida como cerraduras de exclusión mutua, se utilizan para implementar secciones críticas y proteger las estructuras de datos compartidas contra accesos concurrentes.

   Se dice que las variables mutex, es la forma más fácil de implementar la sincronización de hilos y de proteger recursos compartidos cuando acontecen multitud de intentos de acceso sobre esos recursos. Dicha "protección" la realizan al "cerrar el candado o cerradura" para no permitir el acceso.

   Solo un hilo puede cerrar un candado en un determinado instante. Incluso si varios hilos intentan cerrar el mismo candado solo uno saldrá victorio. Ningún otro hilo podrá poseer dicho recurso hasta que el hilo que lo cerró lo abra.

3.4.2. Semáforos.

   En el caso de los semáforos, podemos establecer un número máximo de hilos que pueden tener acceso simultáneo a un recurso compartido en específico; es decir, es una variable especial que constituye el método clásico para restringir o permitir el acceso a recursos compartidos.

   Cada vez que un hilo intenta utilizar el recurso compartido, existe un contador que se va decrementando en uno y lo deja pasar. En el momento en que el contador se convierte en cero, deja bloqueado al hilo que intentó el acceso.

Inicia(Semáforo s, Entero v)
{
  s = v;       // Declara el contador de tipo entero
}
P(Semáforo s)
{
  if(s>0)      // Si aún no se ha excedido el número permitido deja pasar el hilo
      s = s-1; // Decrementa el contador 
  else         // Si ya se tiene el número permitido de hilos ejecutándose
      wait();  // Deja el hilo en espera
}
V(Semáforo s)
{
   if(!procesos_bloqueados)
        s = s+1;  
   else
        signal(); 
}
   Un tipo simple de semáforo es el binario, que puede tomar los valores de 0 y 1. Se inicializa en 1 y son usados
cuando solo un proceso puede acceder a un recurso a la vez. Son esencialmente lo mismo que el mutex.
 
3.4.3. Barreras (Barrier).
Las barreras son otro método de sincronización, y el más fácil de entender. Una barrera es un punto de encuentro
entre varios hilos, en donde todos los hilos ejecutan una acción o diferentes acciones hasta llegar al barrier o punto
de encuentro, una vez que han llegado todos los hilos, éstos pueden continuar con su ejecución. Esto se utiliza
generlamente, cuando una aplicación funciona por fases.
La clave en éste método de sincronización es el método wait() que hará que los hilos esperen hasta la llegada de
todos.

Comentarios

Entradas más populares de este blog

3.3 CREACION Y CONTROL DE HILOS

3.2 COMPARACION DE UN PROPGRAMA DE FLUJO UNICO CONTRA UNO DE FLUJO MULTIPLE