using System;
using System.Threading;
namespace Recetas.Multithreading.Cap01.R0104
{
public sealed class BloqueoRegionCritica
{
// Instancias de bloqueo de región crítica:
private static Object bloqueo1 = new Object();
private static Object bloqueo2 = new Object();
public static void Main()
{
Console.Title = "--- Uso de Monitor y de Lock ---";
// Creación de un thread para prueba del método `MetodoConBloqueoExtentido`:
Thread t = new Thread (() => MetodoConBloqueoExtentido(bloqueo1, bloqueo2));
// Inicio de ejecución del thread:
t.Start ();
// Inicio de región crítica:
lock (bloqueo2)
{
Thread.Sleep (1000);
Console.WriteLine ("\nUso de Monitor.TryEnter para evitar bloqueo: ");
if (Monitor.TryEnter (bloqueo1, TimeSpan.FromSeconds (5)))
{
Console.WriteLine ("\tAcceso seguro a la región crítica.");
}
else
{
Console.WriteLine ("El tiempo de bloqueo permitido ha transcurrido.");
}
}
// Creación otro thread para demostrar el bloqueo definitivo:
Console.WriteLine ("\n\nDemostración de bloqueo definitivo");
Thread t2 = new Thread (() => MetodoConBloqueoExtentido(bloqueo1, bloqueo2));
// Inicio ejecución:
t2.Start ();
lock (bloqueo2)
{
Console.WriteLine ("Aquí ocurre un bloqueo permanente.");
Thread.Sleep (1000);
lock(bloqueo1)
{
Console.WriteLine ("\tAcceso seguro a esta región crítica.");
}
}
}
// Simula una tarea que contiene regiones críticas:
private static void MetodoConBloqueoExtentido(Object o1, Object o2)
{
// Bloqueo sobre el primer objeto -bloqueo1-:
lock (o1)
{
Thread.Sleep (1000);
// Bloqueo sobre el segundo objeto -bloqueo2-:
lock (o2);
}
}
}
}