Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- 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);
- }
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement