Advertisement
Fhernd

SincronizacionConsola.cs

Jul 23rd, 2014
2,565
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 3.16 KB | None | 0 0
  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. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement