Advertisement
Fhernd

RecursoCompartidoConsola.cs

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