1. 程式人生 > >五分鐘瞭解Semaphore

五分鐘瞭解Semaphore

一、前言

多個執行緒之間的同步,我們會用到Semaphore,翻譯成中文就是訊號量。使用Semaphore可以限制多個執行緒對同一資源的訪問。我們先看下C#中對Semaphore的定義,如下圖:

 翻譯成中文就是:

 個人理解就是執行緒之間靠這個訊號量完成通訊。比如B執行緒必須要等A執行緒完成後才能工作,也可以用來控制併發的執行緒數,下面我們看具體的例子,程式碼如下:

 上面程式碼先聲明瞭一個Semaphore物件,建構函式中Semaphore(3,3)表示初始執行緒數和最大執行緒數,表示對同一資源的訪問,最多同時允許3個執行緒併發執行,執行結果如下:

 如果我們將值改為Semaphore(5,5),則表示可以同時併發執行5個執行緒,執行結果如下:

 我們看到執行緒執行方法的第一行程式碼為semaphore.WaitOne(),會判斷當前訊號量,如果當前訊號量大於0則繼續執行,如果等於0則會阻塞當前執行緒並將訊號量減1(當前為-1),直到有執行緒釋放並將資訊號。註釋截圖如下:

 當其他執行緒執行完成後,執行程式碼semaphore.Release(),此時會將訊號量加1,如果加完後訊號量的值小於或等於0,則會喚醒一個阻塞在該訊號量上的執行緒。註釋截圖如下:

 

二、原理

個人對Semaphore的理解其實比較簡單,就是規定對一個公有資源同時可操作的最大執行緒數,wait執行數量減1操作,signal執行數量加1操作,且這兩個操作由作業系統保證原子性。我們可以先看一段虛擬碼,如下:

 程式碼解讀:

wait(),申請資源,對訊號量做減1操作,減完後如果值小於0,表示資源已經分配完,進行阻塞等待。

signal(),釋放資源,對訊號量做加1操作,加完後如果值小於等於0,則喚醒等待的執行緒並執行。

 

<完>

 

更多精彩文章,可關注我的公眾號:

&n