fork download
  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. }
Time limit exceeded #stdin #stdout 15s 38600KB
stdin
Standard input is empty
stdout
Standard output is empty