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);
}
}
}
}