1:Mutex
Mutex 就像一个C# lock一样,不同的是它可以跨进程.
进入和释放一个Mutex要花费几毫秒,大约比C#的lock慢50倍。
使用一个Mutex的实例,调用WaitOne方法来获取锁,ReleaseMutex方法来释放锁。
因为Mutex是跨进程的,所以我们可以使用Mutex来检测程序是否已经运行。
public static void MainThread()
{
using (var mutex = new Mutex(false, "LoveJenny OneAtATimeDemo"))
{
if (!mutex.WaitOne(TimeSpan.FromSeconds(3), false))
{
Console.WriteLine("只能运行一个应用程序!");
return;
}
RunProgram();
}
}
2:Semaphore:
一个Semaphore就像一个酒吧一样,通过门卫来限制它的客人,一旦到达限制,没有人可以进入,
人们会在门外乖乖的排队,一旦有一个人离开酒吧,排队中的人就可以进入了一个了。
下面是个例子:
class TheClub
{
//只能容纳三个人的酒吧
static SemaphoreSlim _sem = new SemaphoreSlim(3);
public static void MainThread()
{
for (int i = 1; i 0)
{
task = _tasks.Dequeue();
if (task == null)
return;
}
if (task != null) //如果有任务的话,执行任务
{
Console.WriteLine(" erforming task: " + task);
Thread.Sleep(1000);
}
else //否则阻塞,去睡觉吧
{
_wh.WaitOne();
}
}
}
}
}主线程调用如下:
public static void Main()
{
using (ProducerConsumerQueue q = new ProducerConsumerQueue())
{
q.EnqueueTask("Hello");
for (int i = 0; i |