using System; using System.Threading; namespace Recetas.CSharp.Cap04.R0410 { public sealed class UsoSincronizacionSemaphore { // Representa una instancia de Semaphore: private static Semaphore semaforo; // Intervalo de orden de la salida: private static int _intervalo; public static void Main() { Console.Title = "Uso Sincronización Semáforo"; Console.WriteLine (); // Crea una instancia de Semaphore> semaforo = new Semaphore(0, 3); // Crea hasta 5 threads: for (int i = 1; i <= 5; ++i) { Thread t = new Thread(new ParameterizedThreadStart (Tarea)); t.Start (i); } // Suspensión por 0.5 segundos para dejar que todos los // threads entren en el semáforo: Thread.Sleep (500); // Completa el semáforo (atención de todos los threads): Console.WriteLine ("Invocación de semaforo.Release(3)."); semaforo.Release(3); Console.WriteLine ("\n`Main` ha finalizado.\n"); } private static void Tarea(object numero) { // Cada thread solicita el paso al objeto Semaphore: Console.WriteLine ("El thread `{0}` se ha iniciado y espera en el semáforo.", numero ); semaforo.WaitOne (); // Suma una cantidad de tiempo al intervalo anterior: int intervalo = Interlocked.Add (ref _intervalo, 100); Console.WriteLine ("El thread `{0}` acaba de entrar al semáforo.", numero ); // Simula la ejecución de una tarea larga: Thread.Sleep (1000 + intervalo); Console.WriteLine ("El thread `{0}` libera el semáforo.", numero ); Console.WriteLine ("Contador de threads en el semáforo: {0}", semaforo.Release() ); } } }