Advertisement
Fhernd

BloqueoMutuo.cs

Sep 25th, 2014
36,987
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 2.44 KB | None | 0 0
  1. using System;
  2. using System.Threading;
  3.  
  4. namespace Recetas.Multithreading.R0202
  5. {
  6.     public sealed class BloqueoMutuo
  7.     {
  8.         public static void Main()
  9.         {        
  10.             Console.Title = "=== Demostración Bloqueo Mutuo ===";
  11.             Console.WriteLine ();
  12.            
  13.             // Instancias de `Object` para bloqueo de regiones críticas:
  14.             object bloqueo1 = new object();
  15.             object bloqueo2 = new object();
  16.            
  17.             // Creación de un objeto `Thread` para iniciar el método
  18.             // `Bloquear`:
  19.             new Thread (() => Bloquear(bloqueo1, bloqueo2)).Start();
  20.            
  21.             // Intento casi simultáneo de región crítica con el objeto
  22.             // `bloqueo2`:
  23.             lock (bloqueo2)
  24.             {
  25.                 // Espera durante un segundo:
  26.                 Thread.Sleep (1000);
  27.                
  28.                 Console.WriteLine ("La invocación del método `Monitor.TryEnter` evita el bloqueo " +
  29.                     "de la aplicación, en caso de no liberarse el recurso solicitado se esperan " +
  30.                     "5 segundos"
  31.                 );
  32.                
  33.                 if (Monitor.TryEnter (bloqueo1, TimeSpan.FromSeconds (5)))
  34.                 {
  35.                     Console.WriteLine ("Acceso satisfactorio a recurso protegido.");
  36.                 }
  37.                 else
  38.                 {
  39.                     Console.WriteLine ("El tiempo de espera se superó.");
  40.                 }
  41.             }
  42.            
  43.             // Creación de un nuevo objeto `Thread` para invocar nuevamente
  44.             // el método `Bloquear`:
  45.             new Thread (() => Bloquear (bloqueo1, bloqueo2)).Start();
  46.            
  47.             Console.WriteLine ("\n----------------------------------");
  48.            
  49.             lock (bloqueo2)
  50.             {
  51.                 Console.WriteLine ("Aquí ocurre un bloqueo mutuo (deadlock).");
  52.                
  53.                 Thread.Sleep (1000);
  54.                
  55.                 lock (bloqueo1)
  56.                 {
  57.                     Console.WriteLine ("Acceso satisfactorio a recurso protegido.");
  58.                 }
  59.             }
  60.         }
  61.        
  62.         private static void Bloquear(object bloqueo1, object bloqueo2)
  63.         {
  64.             lock (bloqueo1)
  65.             {
  66.                 Thread.Sleep (1000);
  67.                
  68.                 lock (bloqueo2);
  69.             }
  70.         }
  71.     }
  72. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement