天天看點

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

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

本節将描述如何使用readerwriterlockslim來建立一個線程安全的機制,在多線程中對一個集合進行讀寫操作。readerwriterlockslim代表了一個管理資源通路的鎖,允許多個線程同時讀取,以及獨占寫。

為了學習本節,你需要安裝visual studio 2015。除此之外無需其他準備。

本節的源代碼放置在booksampleschapter2recipe8目錄中。

請執行以下步驟來了解如何使用readerwriterlockslim類來建立一個線程安全的機制,在多線程中對集合進行讀寫操作:

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

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

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

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

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

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

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

5.運作程式。

當主程式啟動時,同時運作了三個線程來從字典中讀取資料,還有另外兩個線程向該字典中寫入資料。我們使用readerwriterlockslim類來實作線程安全,該類專為這樣的場景而設計。

這裡使用兩種鎖:讀鎖允許多線程讀取資料,寫鎖在被釋放前會阻塞了其他線程的所有操作。擷取讀鎖時還有一個有意思的場景,即從集合中讀取資料時,根據目前資料而決定是否擷取一個寫鎖并修改該集合。一旦得到寫鎖,會阻止閱讀者讀取資料,進而浪費大量的時間,是以擷取寫鎖後集合會處于阻塞狀态。為了最小化阻塞浪費的時間,可以使用enterupgradeablereadlock和exitupgradeablereadlock方法。先擷取讀鎖後讀取資料。如果發現必須修改底層集合,隻需使用enterwritelock方法更新鎖,然後快速執行一次寫操作,最後使用exitwritelock釋放寫鎖。

在本例中,我們先生成一個随機數。然後擷取讀鎖并檢查該數是否存在于字典的鍵集合中。如果不存在,将讀鎖更新為寫鎖然後将該新鍵加入到字典中。始終使用try/finally代碼塊來確定在捕獲鎖後一定會釋放鎖,這是一項好的實踐。

所有的線程都被建立為背景線程。主線程在所有背景線程完成後會等待30秒。