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