3、Semaphore
限制可同时访问某一资源或资源池的线程数。
信号量的计数在每次线程进入信号量时减小,在线程释放信号量时增加。当计数为零时,后面的请求将被阻塞,直到有其他线程释放信号量。当所有的线程都已释放信号量时,计数达到创建信号量时所指定的最大值。(MSDN)
上面代码的Semaphore实现
class Program
{
//初始化为一个信号量,且最大信号量为1,所以当 _pool.Release(2)时会报错。
private static Semaphore _pool = new Semaphore(1, 1);
static void Main(string[] args)
{
CompareExchange();
Console.Read();
}
static void CompareExchange()
{
for (int i = 0; i < 4; i++)
{
Thread tr = new Thread(doing);
tr.Start(i);
}
}
static void doing(object threadName)
{
_pool.WaitOne();
int i = 0;
while (i < 10)
{
Thread.Sleep(100);
Console.WriteLine(threadName + " " + i++);
}
Console.WriteLine(threadName + "over ");
//释放信号量
_pool.Release();
}
}
{
//初始化为一个信号量,且最大信号量为1,所以当 _pool.Release(2)时会报错。
private static Semaphore _pool = new Semaphore(1, 1);
static void Main(string[] args)
{
CompareExchange();
Console.Read();
}
static void CompareExchange()
{
for (int i = 0; i < 4; i++)
{
Thread tr = new Thread(doing);
tr.Start(i);
}
}
static void doing(object threadName)
{
_pool.WaitOne();
int i = 0;
while (i < 10)
{
Thread.Sleep(100);
Console.WriteLine(threadName + " " + i++);
}
Console.WriteLine(threadName + "over ");
//释放信号量
_pool.Release();
}
}