fork download
  1. using System;
  2. using System.Threading;
  3.  
  4. namespace Recetas.CSharp.Cap04.R0410
  5. {
  6. public sealed class SincronizacionConsola
  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 Semaphore:
  25. private static void MostrarMensajeEnConsola()
  26. {
  27. // Se apropia de un instancia Semaphore con nombre
  28. // 'EjemploSemaphore':
  29. using (Semaphore semaforo = Semaphore.OpenExisting ("EjemploSemaphore"))
  30. {
  31. Rastrear("Inicio ejecución de thread.");
  32.  
  33. while (!terminarThread)
  34. {
  35. // Apoderamiento del semaforo:
  36. semaforo.WaitOne();
  37.  
  38. Rastrear("Apoderamiento del Semaphore.");
  39.  
  40. Thread.Sleep(1000);
  41.  
  42. Rastrear ("Liberación del Semaphore.");
  43.  
  44. semaforo.Release();
  45.  
  46. // Pausa para dar la oportunidad de que otro
  47. // thread se apodere del semaforo:
  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 Semaphore";
  58. Console.WriteLine ();
  59.  
  60. // Creación de una instancia de Semaphore llamada `EjemploSemaphore`:
  61. using (Semaphore semaforo = new Semaphore (2, 2, "EjemploSemaphore"))
  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. // Para finalizar se debe presionar Enter:
  75. Console.ReadLine ();
  76.  
  77. // Finaliza los threads asociados con el método `MostrarMensajeEnConsola`,
  78. // y espera a que se completan antes de deshechar la instancia Semaphore:
  79. terminarThread = true;
  80. t1.Join(5000);
  81. t2.Join(5000);
  82. t3.Join(5000);
  83. }
  84. }
  85. }
  86. }
Success #stdin #stdout 0.05s 38072KB
stdin
Standard input is empty
stdout
[  1] - 01:16:34.9351 : Inicio de ejecución de threads. Presione Enter para finalizar.
[  4] - 01:16:34.9593 : Inicio ejecución de thread.
[  4] - 01:16:34.9616 : Apoderamiento del Semaphore.
[  3] - 01:16:34.9594 : Inicio ejecución de thread.
[  3] - 01:16:34.9619 : Apoderamiento del Semaphore.
[  5] - 01:16:34.9595 : Inicio ejecución de thread.
[  4] - 01:16:35.9619 : Liberación del Semaphore.
[  3] - 01:16:35.9620 : Liberación del Semaphore.
[  5] - 01:16:35.9626 : Apoderamiento del Semaphore.
[  4] - 01:16:36.0625 : A punto de finalizar un thread.
[  3] - 01:16:36.0634 : A punto de finalizar un thread.
[  5] - 01:16:36.9627 : Liberación del Semaphore.
[  5] - 01:16:37.0628 : A punto de finalizar un thread.