martes, 29 de mayo de 2012

Utilización de la palabra Lock en aplicaciones Multihilo.

 

Muchas veces en aplicaciones multihilo, necesitamos controlar que mientras un hilo este ejecutando un método, otro hilo no vaya a ejecutar el mismo método hasta que el hilo1 termine de procesar el método, en otras palabra que el método no se ejecute al mismo tiempo por dos hilos diferentes.
Este tipo de bloqueo se puede realizar a través de una palabra reservada llamada LOCK , que como dije anteriormente no permitirá que un hilo vaya a entrar a un fragmento de código , mientras otro hilo lo este ejecutando, si un hilo intenta entrar al fragmento de código que se encuentra dentro de un LOCK, este hilo esperara a que el otro hilo termine.
La declaración de LOCK Hace un llamado al método Monitor.Enter y al finalizar al método Monitor.Exit con un try / Finally como se muestra a continuación:
Monitor.Enter (_locker);
try
{
  <procedimientos>
}
finally
{
Monitor.Exit (_locker);
}






Veamos el siguiente ejemplo en donde vamos a crear una aplicación de consola llamada Calculador_Thread la cual contiene una clase que tiene tres métodos que reciben dos números respectivamente e imprime la suma de dichos dos números, resta y multiplicación respetivamente.
clip_image002
en dicha clase creamos los métodos de la siguiente manera:
clip_image004
Creamos una detención de la ejecución de los hilos por un tiempo de 1 Segundo con Thread.Sleep(1000), para cada uno de los métodos en el main de la aplicación creamos un hilo de tal forma que cada operación sea realizada en un hilo diferente. El código de la aplicación main lo podemos visualizar a continuación:
clip_image005
Al ejecutar esta aplicación de esta forma podemos visualizar el siguiente resultado.
clip_image007
 
Fijemos que a pesar de la generación de la espera para la ejecución de los hilos el resultado de la variable resultado siempre es la multiplicación de dichos dos números, esto porque las operaciones se están ejecutando de manera paralela y la variable resultado puede ser modificada mientras dos hilos están ejecutándose al mismo tiempo. Que sucede si detenemos la aplicación y volvemos a ejecutarla?
clip_image009
Fijemos que debido a la ejecución multihilo, en algunos momentos un método se ejecuta antes que otro, a pesar de que el orden de ejecución de los hilos para este caso primero es la suma, luego la resta y por ultimo la multiplicación, sin embargo todo depende de que tan ocupado este el procesador donde se esta ejecutando el hilo creado. Sin comparamos la ejecución de la aplicación con respecto a la anterior vemos que el método de multiplicación se realizo en segundo lugar.
Utilicemos ahora la palabra reservada Lock la cual nos ayudara a que el fragmento de código sea ejecutado y nos alcance a presentar el valor de la variable resultado al imprimirla en pantalla , a pesar de que otro hilo este intentando modificar la variable resultado, de tal forma que el código de la clase operaciones quedara de la siguiente forma:
clip_image011
El resultado final cuando realizamos el bloqueo de la ejecución del fragmento de código es el siguiente:
clip_image013
Para finalizar este post es necesario que el desarrollador como buena práctica de la utilización de la palabra Lock nunca intente bloquear una variable pública ya que se convertiría en un problema para la administración de la varia

















No hay comentarios:

Publicar un comentario