”信号量非常类似于互斥,信号量可以同时由多个线程使用。
信号量是一种计数的互斥锁定,可以定义允许同时访问受旗语锁定保护的资源的线程个数。
如果需要限制可用资源的线程数,信号量就非常有用。例如,如果系统有3个物理端口可用,就允许3个线程同时访问I/O端口,但第4个线程就需要等待前3个线程中的一个释放资源。
.NET4.5位信号量功能提供了两个类Semphore和SemphoreSlim。Semphore类可以命名,使用系统内的资源,允许在不同进程之间同步。SemphoreSlim类对较短等待时间进行了优化的轻型版本。”
using System; using System.Windows.Forms; using System.Threading.Tasks; using System.Threading; namespace UnitTest { class Program { static void Main(string[] args) { int taskCount = 6; int semaphoreCount = 3; var semaphore = new SemaphoreSlim(3,3); var tasks = new Task[taskCount]; for (int i = 0; i < taskCount; i++) { tasks[i] = Task.Factory.StartNew(()=>TaskMain(semaphore)); } Task.WaitAll(tasks); Console.ReadLine(); } static void TaskMain(SemaphoreSlim semaphore) { bool isCompleted = false; while (!isCompleted) { if (semaphore.Wait(600)) { try { Console.WriteLine("Task {0} locks ths semphore {1}", Task.CurrentId,DateTime.Now.ToString(" HH:mm:ss.ffff")+" "+Task.CurrentId); Thread.Sleep(2000); } finally { Console.WriteLine("Task {0} release the semphoreb {1}", Task.CurrentId,DateTime.Now.ToString(" HH:mm:ss.ffff")); semaphore.Release(); isCompleted = true; } } else { Console.WriteLine("Timeout for task {0};wait again {1}",Task.CurrentId,DateTime.Now.ToString(" HH:mm:ss.ffff")); } } } } }
参考:《C#高级编程》(第9版)P593