天天看點

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

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

本節将描述如何不使用核心模型的方式來使線程等待。另外,我們介紹了spinwait,它是一個混合同步構造,被設計為使用使用者模式等待一段時間,然後切換到核心模式以節省cpu時間。

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

請執行以下步驟來了解如何不借助于核心模式方法來實作線程等待:

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

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

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

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

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

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

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

5.運作程式。

當主程式啟動時,定義了一個線程,将執行一個無止境的循環,直到20毫秒後主線程設定_iscompleted變量為true。我們可以試驗運作該周期為20~30秒,通過windows任務管理器測量cpu的負載情況。取決于cpu核心數量,任務管理器将顯示一個顯著的處理時間。

我們使用volatile關鍵字來聲明_iscompleted靜态字段。volatile關鍵字指出一個字段可能會被同時執行的多個線程修改。聲明為volatile的字段不會被編譯器和處理器優化為隻能被單個線程通路。這確定了該字段總是最新的值。

然後我們使用了spinwait版本,用于在每個疊代列印一個特殊标志位來顯示線程是否切換為阻塞狀态。運作該線程5毫秒來檢視結果。剛開始,spinwait嘗試使用使用者模式,在9個疊代後,開始切換線程為阻塞狀态。如果嘗試測量該版本的cpu負載,在windows任務管理器将不會看到任何cpu的使用。

繼續閱讀