fork download
  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 tiempo:
  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. }
Success #stdin #stdout 0.04s 38032KB
stdin
Standard input is empty
stdout
Thread No. 1 está solicitando al acceso al recurso.
Thread No. 2 está solicitando al acceso al recurso.
El thread `Thread No. 2` ha accedido al recurso compartido.
Thread No. 3 está solicitando al acceso al recurso.
El thread `Thread No. 1` no tendrá acceso al recurso compartido.
El thread `Thread No. 3` no tendrá acceso al recurso compartido.
El thread `Thread No. 2' está próximo a terminar.
El thread `Thread No. 2` ha liberado el mutex.