一、信號量介紹
信號量是一種計數器,用於維護同時訪問某一資源的進程數目,是操作系統中用於同步進程之間訪問共享資源的一種方式。C#提供了Semaphore類來處理多線程訪問共享資源的問題。
二、Semaphore類
Semaphore類提供兩個重載的構造函數:
Semaphore(int initialCount, int maximumCount) Semaphore(int initialCount, int maximumCount, string name, out bool createdNew)
initialCount表示初始計數器的值,maximumCount表示最大計數器的值。第二個構造函數除了前兩個參數外,還可以傳入信號量名稱和一個布爾類型的輸出參數。
三、WaitOne和Release
Semaphore類有兩個最重要的方法:WaitOne和Release。WaitOne方法會使計數器減1,如果當前計數器值小於等於0,那麼線程將會被阻塞直到其他線程調用Release方法來增加計數器的值;而Release方法則會增加計數器的值,如果有其他線程在等待信號量,那麼其中一個線程將會被喚醒。
下面是一個使用Semaphore類的例子:
using System; using System.Threading; class Program { static Semaphore semaphore = new Semaphore(2, 2); static void Main(string[] args) { for (int i = 1; i <= 5; i++) { Thread t = new Thread(Enter); t.Name = "Thread " + i; t.Start(); } Console.ReadLine(); } static void Enter() { Console.WriteLine(Thread.CurrentThread.Name + " is waiting"); semaphore.WaitOne(); Console.WriteLine(Thread.CurrentThread.Name + " is entered"); Thread.Sleep(2000); Console.WriteLine(Thread.CurrentThread.Name + " is exiting"); semaphore.Release(); } }
在這個例子中,Semaphore類的初始值為2,即可以同時有兩個線程訪問共享資源。當五個線程依次嘗試訪問共享資源時,前兩個線程可以直接通過,後面的三個線程需要等待前面兩個線程中的任意一個線程退出才能繼續訪問。
四、應用場景
Semaphore類廣泛應用於同步多線程對共享資源的訪問。比如:
cba賽程
在一個籃球比賽中,有很多球員需要訪問球場。然而,籃球比賽的規則是同一時間只能有10個球員在場上。Semaphore類就可以用來模擬這個場景,控制同時在場上的球員數。
Semaphore playerCount = new Semaphore(10, 10);
每當一個球員進入場上,可以調用WaitOne方法並減少計數器的值;當球員退出場上時,調用Release方法增加計數器的值。
coach
在籃球比賽中,還有教練需要等待球員來報告比賽情況,以便進行決策。Semaphore類也可以用來模擬這個場景,控制教練與球員的交互。
Semaphore coachSem = new Semaphore(0, 1);
每當一個球員需要與教練交互時,可以調用WaitOne方法並減少計數器的值,表示教練有一個等待會議的球員;當球員與教練交互結束時,調用Release方法增加計數器的值,表示有一個球員結束了等待。
cctv5節目表
在電視台中,有多個電視節目需要共用同一塊廣告牌。Semaphore類就可以用來控制這個訪問過程,只允許一個電視節目使用廣告牌。
Semaphore billboard = new Semaphore(1, 1);
每當一個電視節目需要使用廣告牌時,可以調用WaitOne方法並減少計數器的值;當這個電視節目結束時,調用Release方法增加計數器的值。
chat GPT人工智能
在一個聊天室中,多個用戶需要向人工智能發起提問並獲取答案。由於人工智能的資源有限,需要控制同時發起提問的用戶數量。
Semaphore aiServer = new Semaphore(5, 5);
每當一個用戶需要向人工智能發起提問時,可以調用WaitOne方法並減少計數器的值;當這個用戶收到答案並離開時,調用Release方法增加計數器的值。
cctv5在線直播
在一個視頻直播網站中,多個用戶需要同時觀看同一個直播,但受服務器帶寬限制,需要通過Semaphore類來控制同時觀看直播的用戶數量。
Semaphore liveStream = new Semaphore(100, 100);
每當一個用戶需要觀看直播時,可以調用WaitOne方法並減少計數器的值;當這個用戶離開時,調用Release方法增加計數器的值。
c1駕照能開什麼車
在一個駕照考試中,多個學員需要同時進行科目一模擬考試,但考試機器的數量有限,需要通過Semaphore類來控制同時進行科目一模擬考試的學員數量。
Semaphore simTestMachine = new Semaphore(10, 10);
每當一個學員需要進行科目一模擬考試時,可以調用WaitOne方法並減少計數器的值;當這個學員考試結束時,調用Release方法增加計數器的值。
c反應蛋白高說明什麼
在醫療診斷中,需要對多個患者進行血液分析,但血液分析儀的數量有限,需要控制同時進行血液分析的患者數量。
Semaphore bloodAnalyzer = new Semaphore(5, 5);
每當一個患者需要進行血液分析時,可以調用WaitOne方法並減少計數器的值;當這個患者分析結束時,調用Release方法增加計數器的值。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/303053.html