semaphore和mutex相似,但是semaphore可以被多个线程同时使用。semaphore好比一个计数的mutex,它可以定义一个线程数,允许多线程同时访问资源。当某些资源只允许一些指定数量的线程访问时,semaphore就很有用。比如,当你访问IO端口,有3个端口可以使用,这时3个线程可以同时访问这些端口。而第四个线程则必须等待资源被其中一个线程释放才能访问这些资源。
.NET 4 提供了2个semaphore功能:Semaphore和SemaphoreSlim。Semaphore可以被命名,可以使用整个系统的资源,允许同步于不同的进程。SemaphoreSlim则是一个轻量级的版本,为较短时间的等待做过优化。
semaphore由System.Threading.Semaphore实现,它有几个构造函数,最简单的构造函数如下:
public Semaphore(int initialCount, int maximumCount)
这里,initialCount指定了初始的时候Semaphore所允许的线程数,maximumCount则传递了最大的线程数。
private static Semaphore room = new Semaphore(1, 3);
static void Main(string[] args)
{
for (int i = 0; i < 5; i++)
{
Thread t = new Thread(peoplegotoroom);
t.Start(i);
}
}
private static void peoplegotoroom(object num)
{
Console.WriteLine(num.ToString() + "want to in");
room.WaitOne();
Console.WriteLine(num.ToString() + "in");
Thread.Sleep(5000);
Console.WriteLine(num.ToString() + "want to out");
room.Release();
Console.WriteLine(num.ToString() + "out");
}
本文转自cnn23711151CTO博客,原文链接:http://blog.51cto.com/cnn237111/516256 ,如需转载请自行联系原作者