Advertisement
Fhernd

BloqueoRegionCritica.cs

Aug 21st, 2014
2,173
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 2.37 KB | None | 0 0
  1. using System;
  2. using System.Threading;
  3.  
  4. namespace Recetas.Multithreading.Cap01.R0104
  5. {
  6.     public sealed class BloqueoRegionCritica
  7.     {
  8.         // Instancias de bloqueo de región crítica:
  9.         private static Object bloqueo1 = new Object();
  10.         private static Object bloqueo2 = new Object();
  11.    
  12.         public static void Main()
  13.         {
  14.             Console.Title = "--- Uso de Monitor y de Lock ---";
  15.        
  16.             // Creación de un thread para prueba del método `MetodoConBloqueoExtentido`:
  17.             Thread t = new Thread (() => MetodoConBloqueoExtentido(bloqueo1, bloqueo2));
  18.            
  19.             // Inicio de ejecución del thread:
  20.             t.Start ();
  21.            
  22.             // Inicio de región crítica:
  23.             lock (bloqueo2)
  24.             {
  25.                 Thread.Sleep (1000);
  26.                
  27.                 Console.WriteLine ("\nUso de Monitor.TryEnter para evitar bloqueo: ");
  28.                 if (Monitor.TryEnter (bloqueo1, TimeSpan.FromSeconds (5)))
  29.                 {
  30.                     Console.WriteLine ("\tAcceso seguro a la región crítica.");
  31.                 }
  32.                 else
  33.                 {
  34.                     Console.WriteLine ("El tiempo de bloqueo permitido ha transcurrido.");
  35.                 }
  36.             }
  37.            
  38.             // Creación otro thread para demostrar el bloqueo definitivo:
  39.             Console.WriteLine ("\n\nDemostración de bloqueo definitivo");
  40.             Thread t2 = new Thread (() => MetodoConBloqueoExtentido(bloqueo1, bloqueo2));
  41.            
  42.             // Inicio ejecución:
  43.             t2.Start ();
  44.            
  45.             lock (bloqueo2)
  46.             {
  47.                 Console.WriteLine ("Aquí ocurre un bloqueo permanente.");
  48.                 Thread.Sleep (1000);
  49.                 lock(bloqueo1)
  50.                 {
  51.                     Console.WriteLine ("\tAcceso seguro a esta región crítica.");
  52.                 }
  53.             }
  54.         }
  55.        
  56.         // Simula una tarea que contiene regiones críticas:
  57.         private static void MetodoConBloqueoExtentido(Object o1, Object o2)
  58.         {
  59.             // Bloqueo sobre el primer objeto -bloqueo1-:
  60.             lock (o1)
  61.             {
  62.                 Thread.Sleep (1000);
  63.                 // Bloqueo sobre el segundo objeto -bloqueo2-:
  64.                 lock (o2);
  65.             }
  66.         }
  67.     }
  68. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement