Semaphore的理解
通過使用一個計數器對共用資源進行存取控制,Semaphore構造器需要提供初始化的計數器(訊號量)大小以及最大的計數器大小
訪問共用資源時,程式首先申請一個向Semaphore申請一個許可證,Semaphore的許可證計數器相應的減一,當計數器為0時,其他申請該訊號量許可證的線程將被堵賽,直到先前已經申請到許可證的線程釋放他佔用的許可證讓計數器加一,這樣最近去申請許可證的線程將會得到競爭得到被釋放的許可證。
常見的操作方法 WaitOne():申請一個許可證 Release():釋放佔用的許可證
具體使用看下面的範例程式碼:
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading;namespace MutiThread{ /// <summary> /// .net 訊號量Semaphore的使用 /// </summary> class Program { static void Main(string[] args) { //初始化4個線程 Mythread mythrd1 = new Mythread("Thrd #1"); Mythread mythrd2 = new Mythread("Thrd #2"); Mythread mythrd3 = new Mythread("Thrd #3"); Mythread mythrd4 = new Mythread("Thrd #4"); //Join()方法阻塞調用線程 //達到主線程在4個子線程執行完畢才退出的目的 mythrd1.thrd.Join(); mythrd2.thrd.Join(); mythrd3.thrd.Join(); mythrd4.thrd.Join(); } } /// <summary> /// 封裝線程類 /// </summary> class Mythread { public Thread thrd; //建立一個可授權2個許可證的訊號量,且初始值為2 static Semaphore sem = new Semaphore(2, 2); public Mythread(string name) { thrd = new Thread(this.run); thrd.Name = name; thrd.Start(); } void run() { Console.WriteLine(thrd.Name + "正在等待一個許可證……"); //申請一個許可證 sem.WaitOne(); Console.WriteLine(thrd.Name + "申請到許可證……"); for (int i = 0; i < 4; i++) { Console.WriteLine(thrd.Name + ": " + i); Thread.Sleep(1000); } Console.WriteLine(thrd.Name + " 釋放許可證……"); //釋放許可證 sem.Release(); } }}
程式執行結果為: