一、概述
信号量的作用类似银行的柜台,具有一定的数量,当柜台都已有顾客在办理事务时,后面的顾客只能排队等待某个柜台办理完结后再进入柜台。
信号量需要设置最大的允许数量和当前的空位数量。
容量为1的信号量即与 lock 和 Mutex 功能类似
.NET提供了两个信号量:
- Semaphore:继承自线程通信事件WaitHandle。
- SemaphoreSlim:轻量级信号量
二、代码
设置信号量最大允许数量为3,开5个线程,只会同时运行3个:
static SemaphoreSlim _sem = new SemaphoreSlim (3); // 容量为 3
static void Main()
{
for (int i = 1; i <= 5; i++) new Thread (Enter).Start (i);
}
static void Enter (object id)
{
Console.WriteLine (id + " wants to enter");
_sem.Wait();
Console.WriteLine (id + " is in!"); // 同时只能有
Thread.Sleep (1000 * (int) id); // 3个线程
Console.WriteLine (id + " is leaving"); // 执行这里
_sem.Release();
}
运行的结果如下:
1 wants to enter
1 is in!
2 wants to enter
2 is in!
3 wants to enter
3 is in!
4 wants to enter
5 wants to enter
1 is leaving
4 is in!
2 is leaving
5 is in!
参考链接: