fork download
  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. }
Time limit exceeded #stdin #stdout 15s 37576KB
stdin
Standard input is empty
stdout
Uso de Monitor.TryEnter para evitar bloqueo: 
El tiempo de bloqueo permitido ha transcurrido.


Demostración de bloqueo definitivo
Aquí ocurre un bloqueo permanente.