fork download
  1. using System;
  2. using System.Threading;
  3.  
  4. namespace Recetas.CSharp.Cap04.R0409
  5. {
  6. public sealed class RecursoCompartidoConsola
  7. {
  8. // Determina el estado de ejecución de un thread:
  9. private static bool terminarThread = false;
  10.  
  11. // Muestra mensajes de información acerca del estado
  12. // de ejecución de un thread:
  13. private static void Rastrear(string mensaje)
  14. {
  15. Console.WriteLine ("[{0,3}] - {1} : {2}",
  16. Thread.CurrentThread.ManagedThreadId,
  17. DateTime.Now.ToString("HH:mm:ss.ffff"),
  18. mensaje
  19. );
  20. }
  21.  
  22. // Método a encapsular por diferentes threads y que
  23. // contiene una región crítica protegida por un
  24. // objeto Mutex:
  25. private static void MostrarMensajeEnConsola()
  26. {
  27. // Se apropia de un instancia Mutex con nombre
  28. // 'EjemploMutex':
  29. using (Mutex mutex = new Mutex (false, "EjemploMutex"))
  30. {
  31. Rastrear("Inicio ejecución de thread.");
  32.  
  33. while (!terminarThread)
  34. {
  35. // Apoderamiento del mutex:
  36. mutex.WaitOne();
  37.  
  38. Rastrear("Apoderamiento del Mutex.");
  39.  
  40. Thread.Sleep(1000);
  41.  
  42. Rastrear ("Liberación del Mutex.");
  43.  
  44. mutex.ReleaseMutex();
  45.  
  46. // Pausa para dar la oportunidad de que otro
  47. // thread se apodere del mutex:
  48. Thread.Sleep (100);
  49. }
  50.  
  51. Rastrear ("A punto de finalizar un thread.");
  52. }
  53. }
  54.  
  55. public static void Main()
  56. {
  57. Console.Title = "Demostración uso de Sincronización con Mutex";
  58. Console.WriteLine ();
  59.  
  60. // Creación de una instancia de Mutex llamada `EjemploMutex`:
  61. using (Mutex mutex = new Mutex (false, "EjemploMutex"))
  62. {
  63. Rastrear ("Inicio de ejecución de threads. Presione Enter para finalizar.");
  64.  
  65. // Creación de 3 threads:
  66. Thread t1 = new Thread (MostrarMensajeEnConsola);
  67. Thread t2 = new Thread (MostrarMensajeEnConsola);
  68. Thread t3 = new Thread (MostrarMensajeEnConsola);
  69.  
  70. t1.Start();
  71. t2.Start();
  72. t3.Start();
  73.  
  74. Console.ReadLine ();
  75.  
  76. // Finaliza los threads asociados con el método `MostrarMensajeEnConsola`,
  77. // y espera a que se completan antes de deshechar la instancia Mutex:
  78. terminarThread = true;
  79. t1.Join(5000);
  80. t2.Join(5000);
  81. t3.Join(5000);
  82. }
  83. }
  84. }
  85. }
Success #stdin #stdout 0.05s 37024KB
stdin
Standard input is empty
stdout
[  1] - 16:36:02.3128 : Inicio de ejecución de threads. Presione Enter para finalizar.
[  3] - 16:36:02.3357 : Inicio ejecución de thread.
[  4] - 16:36:02.3358 : Inicio ejecución de thread.
[  4] - 16:36:02.3368 : Apoderamiento del Mutex.
[  5] - 16:36:02.3370 : Inicio ejecución de thread.
[  4] - 16:36:03.3384 : Liberación del Mutex.
[  3] - 16:36:03.3474 : Apoderamiento del Mutex.
[  4] - 16:36:03.4394 : A punto de finalizar un thread.
[  3] - 16:36:04.3487 : Liberación del Mutex.
[  5] - 16:36:04.3587 : Apoderamiento del Mutex.
[  3] - 16:36:04.4497 : A punto de finalizar un thread.
[  5] - 16:36:05.3600 : Liberación del Mutex.
[  5] - 16:36:05.4610 : A punto de finalizar un thread.