martes, 19 de junio de 2012

Uso de la Clase Mutex con C#


Continuando con los artículos que tienen que ver con la sincronización de hilos a continuación quiero abordar una clase llamada Mutex (Mutual Exclusion), cuya funcionalidad es asegurar que solamente un hilo pueda tener a acceso a un recurso, o porción de código, esta clase puede ser usada para evitar que múltiples instancias de una aplicación sean iniciadas.
   
Aparentemente la funcionalidad de la clase Mutex es muy parecida a Lock, una de las grandes diferencias entre ellas es que Mutex es una Clase y Lock es una Instrucción, la funcionalidad de Mutex es mayor ya que permite manejar bloqueo a nivel de Sistema Operativo, de tal forma que actua a nivel de proceso.
   
Cuando un Hilo adquiere una exclusión mutua (mutex), el siguiente Hilo que intenta adquirir dicha exclusión mutua se suspende hasta que el primer subproceso libera la exclusión mutua.
   
Existen dos tipo de exclusiones mutuas: exclusiones mutuas locales y exclusiones mutuas del sistema con nombre.
   
Si crea un objeto Mutex con un constructor que acepta un nombre, se asocia a un objeto del sistema operativo con dicho nombre. Las exclusiones mutuas del sistema con nombre son visibles en todo el sistema operativo y se pueden utilizar para sincronizar las actividades de los procesos.
   
Con respecto al desempeño de la utilización de Mutex Vs Lock, La instrucción Lock es mucho mas rápida que la utilización de la clase Mutex.
   
Para utilizar la clase Mutex , se requiere el método WaitOne el cual obtiene el bloqueo exclusivo de un contenido a bloquear. Dicho bloque es liberado con el método ReleaseMutex. De la misma forma que  se bloqueo con Lock , la clase Mutex puede ser liberada únicamente con la terminacion del hilo que la llamo.
   
      private static Mutex mut = new Mutex()
   
Cuando se instancia una clase mutex de esta manera se hace una sobrecarga de este constructor llamando al contructor mutex(false), donde especifica como por defecto false , esto quiere decir que el hilo no es propiertario de el Objeto Mutex.
   
El como se usa se presenta a continuación.
   
    mut.WaitOne();
                    Console.WriteLine("{0} Ingresando de Codigo Protegido",
                    Thread.CurrentThread.Name);
    mut.ReleaseMutex();
   
Miremos en el ejemplo utilizado con la instrucción lock, como se usa con exclusión mutua.
   
   public void Sumar()
            {
               mut.WaitOne();
                    Console.WriteLine("{0} Ingresando de Codigo Protegido",
                    Thread.CurrentThread.Name);
                    resultado = operador1 + operador2;
                    //Bloqueamos el Hilo actual durante un segundo
                    Thread.Sleep(1000);
                    Console.WriteLine("El resultado de la Suma es:" + resultado);
                    Console.WriteLine("{0} Saliendo de Codigo Protegido\r\n",
                    Thread.CurrentThread.Name);
               mut.ReleaseMutex();
           }


Un uso común para la clase Mutex , es el aseguramiento de la ejecución de una única instancia de un programa.
En los próximos post continuaremos con la explicación de los estados de ejecución de un hilo y desde luego con algunos ejemplos sobre ellos.





2 comentarios:

  1. Aun no he trabajado ni profundizado con esto de hilos pero igualmente esto me servira a futuro ya que no lo conocia, un saludo.

    ResponderEliminar
  2. Yo sólo conocía el Lock, al cual siempre se le debe pasar una variable tipo Object por motivos de cómo el .Net administra la memoria.

    ResponderEliminar