| 
 | 3 beginner 0 intermediate 0 advanced | |||
| 
 | ||||
| 
 | Semaphores are used to prevent too many threads from accessing a resource. A good analogy I read in Albahari's book (C# in a nutshell) is to compare a semaphore with a bouncer in a nightclub. A nightclub has a certain capacity. The bouncer allows people to enter the nightclub till it is full. Once its full a queue builds up outside the nightclub and a person is allowed to enter only when some one else leaves the nightclub. Semaphore is like the bouncer. A semaphore is created with a fixed capacity. Only a fixed amount of threads are allowed to access a resource determined by its capacity. Once its full all other threads have to wait till some threads leaves the resource. 
	 class NightClub
{
  static SemaphoreSlim semaphore = new SemaphoreSlim (5);    
  static void Main()
  {
    for (int i = 1; i <= 10; i++) new Thread (EnterTheClub).Start (i);
  }
 
  static void EnterTheClub (object id)
  {
    Console.WriteLine (id + " queues up");
    semaphore .Wait();
    Console.WriteLine (id + " is in!");  
    Thread.Sleep (1000 * (int) id);    
    Console.WriteLine (id + " is leaving");
    semaphore.Release();
  }
}Output 
 4 queues up 1 queues up 1 is in! 5 queues up 7 queues up 7 is in! 5 is in! 4 is in! 8 queues up 8 is in! 9 queues up 10 queues up 3 queues up 6 queues up 2 queues up 1 is leaving 9 is in! 4 is leaving 10 is in! 5 is leaving 3 is in! 7 is leaving 6 is in! 8 is leaving 2 is in! 3 is leaving 9 is leaving 2 is leaving 6 is leaving 10 is leavingSemaphoreSlim and Semaphore are functionally similar. SemaphoreSlim is about 4 times faster than a Semaphore but SemaphoreSlim cannot be used for interprocess signalling. 
	 | |||
| 
 | ||||