考慮這樣的一個情境:一個停車場的只含一定數量的停車位,只有當停車場中還有空位時,停車場的入口才會開啟。C#提供了Semaphore類來處理這種情境。Semaphore類可以在構造時指定資源數量,使用WaitOne方法等待一個資源,使用Release方法釋放一個資源。範例程式碼:
using System;
using System.Threading;
namespace ProcessTest
{
class Program
{
static Semaphore semaphore;
static void Main(string[] args)
{
//建立一個限制資源類
//資源數為5,開放資源數為2
//主線程自動佔有3個資源
semaphore = new Semaphore(2, 5);
//開啟3個線程,讓它們競爭剩餘的2個資源
for (int i = 0; i < 3; i++)
{
Thread t = new Thread(new ThreadStart(WorkerProc));
t.Name = "Thread" + i;
t.Start();
Thread.Sleep(30);
}
System.Console.ReadKey();
}
static void WorkerProc()
{
for (int i = 0; i < 3; i++)
{
//等一個資源訊號
semaphore.WaitOne();
Console.WriteLine(Thread.CurrentThread.Name + ": Begin");
Thread.Sleep(200);
Console.WriteLine(Thread.CurrentThread.Name + ": End");
//釋放資源
semaphore.Release();
}
}
}
}
程式首先建立一個Semaphore類,該類指定資源數為5,但只釋放出2個資源給3個線程競爭,其它3個資源被主線程所佔用。子線程首先等待一個資源,擷取到資源後,休眠200ms,隨後釋放資源。
這段程式的輸出如下: