using System; using System.Threading; namespace Recetas.CSharp.Cap04.R0409 { public sealed class RecursoCompartidoConsola { // Determina el estado de ejecución de un thread: private static bool terminarThread = false; // Muestra mensajes de información acerca del estado // de ejecución de un thread: private static void Rastrear(string mensaje) { Console.WriteLine ("[{0,3}] - {1} : {2}", Thread.CurrentThread.ManagedThreadId, DateTime.Now.ToString("HH:mm:ss.ffff"), mensaje ); } // Método a encapsular por diferentes threads y que // contiene una región crítica protegida por un // objeto Mutex: private static void MostrarMensajeEnConsola() { // Se apropia de un instancia Mutex con nombre // 'EjemploMutex': using (Mutex mutex = new Mutex (false, "EjemploMutex")) { Rastrear("Inicio ejecución de thread."); while (!terminarThread) { // Apoderamiento del mutex: mutex.WaitOne(); Rastrear("Apoderamiento del Mutex."); Thread.Sleep(1000); Rastrear ("Liberación del Mutex."); mutex.ReleaseMutex(); // Pausa para dar la oportunidad de que otro // thread se apodere del mutex: Thread.Sleep (100); } Rastrear ("A punto de finalizar un thread."); } } public static void Main() { Console.Title = "Demostración uso de Sincronización con Mutex"; Console.WriteLine (); // Creación de una instancia de Mutex llamada `EjemploMutex`: using (Mutex mutex = new Mutex (false, "EjemploMutex")) { Rastrear ("Inicio de ejecución de threads. Presione Enter para finalizar."); // Creación de 3 threads: Thread t1 = new Thread (MostrarMensajeEnConsola); Thread t2 = new Thread (MostrarMensajeEnConsola); Thread t3 = new Thread (MostrarMensajeEnConsola); t1.Start(); t2.Start(); t3.Start(); Console.ReadLine (); // Finaliza los threads asociados con el método `MostrarMensajeEnConsola`, // y espera a que se completan antes de deshechar la instancia Mutex: terminarThread = true; t1.Join(5000); t2.Join(5000); t3.Join(5000); } } } }