Data hosted with ♥ by Pastebin.com - Download Raw - See Original
  1. using System;
  2. using System.Threading;
  3.  
  4. namespace Recetas.CSharp.Cap04.R0409
  5. {
  6.     public sealed class UsoSincronizacionMutex
  7.     {
  8.         // Crea una instancia de la clase `Mutex`; además
  9.         // de un número de iteraciones por cada thread y la
  10.         // cantidad de threads a crear:
  11.         private static Mutex mutex = new Mutex();
  12.         private const int numeroIteraciones = 1;
  13.         private const int numeroThreads = 3;
  14.        
  15.         // Punto de entrada a la aplicación:
  16.         public static void Main()
  17.         {
  18.             Console.Title = "Acceso a Recursos Compartidos con Mutex";
  19.             Console.WriteLine ();
  20.            
  21.             // Crea los 3 threads, encapsula el método `Procesar`,
  22.             // les asigna un identificador (alfanumérico), e
  23.             // inicia cada thread:
  24.             for (int i = 1; i <= numeroThreads; ++i)
  25.             {
  26.                 Thread t = new Thread (new ThreadStart (Proceso));
  27.                 t.Name =  String.Format ("Thread No. {0}", i.ToString());
  28.                 t.Start();
  29.             }
  30.         }
  31.        
  32.         // Método encapsulado por cada thread:
  33.         private static void Proceso()
  34.         {
  35.             for (int i = 1; i <= numeroIteraciones; ++i)
  36.             {
  37.                 AccederRecursoCompartido();
  38.             }
  39.         }
  40.        
  41.         // Método para el acceso de recursos compartidos.
  42.         // Debe ser sincronizado:
  43.         private static void AccederRecursoCompartido()
  44.         {
  45.             // Controla el acceso acceso seguro al recurso compartido.
  46.             // Sólo se accede cuando el recurso está disponible:
  47.             Console.WriteLine ("{0} está solicitando al acceso al recurso.",
  48.                 Thread.CurrentThread.Name
  49.             );
  50.             if (mutex.WaitOne (1000))
  51.             {
  52.                 Console.WriteLine ("El thread `{0}` ha accedido al recurso compartido.",
  53.                     Thread.CurrentThread.Name
  54.                 );
  55.                
  56.                 // Especificación de los recursos que deben sincronizarse...
  57.                
  58.                 // Simula la ejecución de una tarea que toma cierto tiempo (5''):
  59.                 Thread.Sleep (5000);
  60.                
  61.                 Console.WriteLine ("El thread `{0}' está próximo a terminar.",
  62.                     Thread.CurrentThread.Name
  63.                 );
  64.                
  65.                 // Liberación del mutex:
  66.                 mutex.ReleaseMutex();
  67.                
  68.                 Console.WriteLine ("El thread `{0}` ha liberado el mutex.",
  69.                     Thread.CurrentThread.Name
  70.                 );
  71.             }
  72.             else
  73.             {
  74.                 Console.WriteLine ("El thread `{0}` no tendrá acceso al recurso compartido.",
  75.                     Thread.CurrentThread.Name
  76.                 );
  77.             }
  78.         }
  79.     }
  80. }