天天看點

《C#多線程程式設計實戰(原書第2版)》——2.2 執行基本的原子操作

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

本節将展示如何對對象執行基本的原子操作,進而不用阻塞線程就可避免競争條件。

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

請執行以下的步驟來了解基本的原子操作:

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

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

《C#多線程程式設計實戰(原書第2版)》——2.2 執行基本的原子操作

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

《C#多線程程式設計實戰(原書第2版)》——2.2 執行基本的原子操作
《C#多線程程式設計實戰(原書第2版)》——2.2 執行基本的原子操作

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

《C#多線程程式設計實戰(原書第2版)》——2.2 執行基本的原子操作

5.運作程式。

當程式運作時,會建立三個線程來運作testcounter方法中的代碼。該方法對一個對象按序執行了遞增或遞減操作。起初的counter對象不是線程安全的,我們會遇到競争條件。是以第一個例子中計數器的結果值是不确定的。我們可能會得到數字0。然而如果運作程式多次,你将最終得到一些不正确的非零結果。

在第1章中,我們通過鎖定對象解決了這個問題。在一個線程擷取舊的計數器值并計算後賦予新的值之前,其他線程都被阻塞了。然而,如果我們采用上述方式執行該操作,中途不能停止。而借助于interlocked類,我們無需鎖定任何對象即可擷取到正确的結果。interlocked提供了increment、decrement和add等基本數學操作的原子方法,進而幫助我們在編寫counter類時無需使用鎖。