天天看點

《C#多線程程式設計實戰(原書第2版)》——2.4 使用SemaphoreSlim類

本節書摘來自華章出版社《c#多線程程式設計實戰(原書第2版)》一書中的第2章,第2.4節,作者(美)易格恩·阿格佛溫(eugene agafonov),黃博文 黃輝蘭 譯,更多章節内容可以通路雲栖社群“華章計算機”公衆号檢視。

本節将展示semaphoreslim類是如何作為semaphore類的輕量級版本的。該類限制了同時通路同一個資源的線程數量。

為了學習本節,你需要安裝visual studio 2015。除此之外無需其他準備。本節的源代碼放置在booksampleschapter2recipe3目錄中。

請執行以下步驟來了解如何借助semaphoreslim類來限制通路同一個資源的線程數量:

1.啟動visual studio 2015。建立一個c#控制台應用程式項目。

2.在program.cs檔案中加入以下using指令:

《C#多線程程式設計實戰(原書第2版)》——2.4 使用SemaphoreSlim類

3.在main方法下面加入以下代碼片段:

《C#多線程程式設計實戰(原書第2版)》——2.4 使用SemaphoreSlim類

4.在main方法中加入以下代碼片段:

《C#多線程程式設計實戰(原書第2版)》——2.4 使用SemaphoreSlim類

5.運作程式。

當主程式啟動時,建立了semaphoreslim的一個執行個體,并在其構造函數中指定允許的并發線程數量。然後啟動了6個不同名稱和不同初始運作時間的線程。

每個線程都嘗試擷取資料庫的通路,但是我們借助于信号系統限制了通路資料庫的并發數為4個線程。當有4個線程擷取了資料庫的通路後,其他兩個線程需要等待,直到之前線程中的某一個完成工作并調用_semaphore.release方法來發出信号。

這裡我們使用了混合模式,其允許我們在等待時間很短的情況下無需使用上下文切換。然而,有一個叫作semaphore的semaphoreslim類的老版本。該版本使用純粹的核心時間(kernel-time)方式。一般沒必要使用它,除非是非常重要的場景。我們可以建立一個具名的semaphore,就像一個具名的mutex一樣,進而在不同的程式中同步線程。semaphoreslim并不使用windows核心信号量,而且也不支援程序間同步。是以在跨程式同步的場景下可以使用semaphore。