1: using System;
2: using System.Collections.Generic;
3: using System.Linq;
4: using System.Text;
5: using System.Threading;
6: using System.Diagnostics;
7:
8: namespace Semaphore
9: {
10: class Program
11: {
12: static void Main(string[] args)
13: {
14: int threadCount = 6;
15: int semaphoreCount = 4;
16: var semaphore = new SemaphoreSlim(semaphoreCount,semaphoreCount);
17: var threads = new Thread[threadCount];
18:
19: for (int i = 0; i < threadCount;i++ )
20: {
21: threads[i] = new Thread(ThreadMain);
22: threads[i].Start(semaphore);
23: }
24:
25: for (int i = 0; i < threadCount;i++ )
26: {
27: threads[i].Join();
28: }
29:
30: Console.WriteLine("All threads finished");
31: }
32:
33: static void ThreadMain(object o)
34: {
35: SemaphoreSlim semaphore = o as SemaphoreSlim;
36: Trace.Assert(semaphore!=null,"o must be a Semaphore type");
37: bool isCompleted = false;
38: while(!isCompleted)
39: {
40: if(semaphore.Wait(600))
41: {
42: try
43: {
44: Console.WriteLine("Thread {0} locks the semaphore", Thread.CurrentThread.ManagedThreadId);
45: Thread.Sleep(2000);
46: }
47: finally
48: {
49: semaphore.Release();
50: Console.WriteLine("Thread {0} releases the semaphore",Thread.CurrentThread.ManagedThreadId);
51: isCompleted = true;
52: }
53: }
54: else
55: {
56: Console.WriteLine("Timeout for thread {0}:wait again", Thread.CurrentThread.ManagedThreadId);
57: }
58: }
59: Console.Read();
60: }
61: }
62: }