国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C# > 正文

C#中使用Interlocked進行原子操作的技巧

2020-01-24 00:55:26
字體:
來源:轉載
供稿:網友

什么是原子操作?

原子(atom)本意是“不能被進一步分割的最小粒子”,而原子操作(atomic operation)意為”不可被中斷的一個或一系列操作” 。在C#中有多個線程同時對某個變量進行操作的時候,我們應該使用原子操作,防止多線程取到的值不是最新的值。

例如:int result = 0;

多線程A正在執行 result(0)+1

多線程B同時執行 result(0)+1

那么最終result的結果是1還是2呢,這個就很難說了。如果在CPU中2個線程同時計算,那么得到的結果則是1,顯然這個結果不是我們想要的。當然你可以使用lock鎖來保障多線程執行的唯一性,但是它的性能遠遠不及原子操作的方式。

使用Interlocked進行原子操作:

使用.NET提供的Interlocked類可以對一些數據進行原子操作,看起來似乎跟lock鎖一樣,但它并不是lock鎖,它的原子操作是基于CPU本身的,非阻塞的,所以要比lock的效率高。

下面使用C#代碼進行演示了原子操作:

class Program{//全局變量private static int _result;//Main方法static void Main(string[] args){//運行后按住Enter鍵數秒,對比使用Interlocked.Increment(ref _result);與 _result++;的不同  while (true){Task[] _tasks = new Task[100];int i = 0;for (i = 0; i < _tasks.Length; i++){_tasks[i] = Task.Factory.StartNew((num) =>{var taskid = (int)num;Work(taskid);}, i);}Task.WaitAll(_tasks);Console.WriteLine(_result);Console.ReadKey();}}//線程調用方法private static void Work(int TaskID){for (int i = 0; i < 10; i++){//_result++;Interlocked.Increment(ref _result);}}}

以上代碼運行分別注釋最后兩行代碼_result++;與Interlocked.Increment(ref _result);的其中一行再運行,運行后按住Enter鍵不放運行數秒,即可看出區別兩者的區別。

至此,就體現出了Interlocked的作用,本文示例源碼下載:Interlocked_Sample.

關于原子操作的其他說明:在32位CPU執行賦值指令,數據傳輸最大寬度4個字節。所以只要在4個字節以下讀寫操作的,32位CPU都是原子操作。所以bool、int這些類型的操作本身就是原子操作。而Interlocked提供的原子操作方法則是底層進行了功能性CPU指令封裝來完成的。

以上所述是小編給大家介紹的C#中使用Interlocked進行原子操作的技巧,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對武林網網站的支持!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 巴林左旗| 苏尼特右旗| 泸水县| 东光县| 霍林郭勒市| 寿阳县| 南投市| 班玛县| 浠水县| 鹰潭市| 涡阳县| 泽普县| 伊吾县| 林州市| 信丰县| 翁源县| 花莲市| 两当县| 盐源县| 英山县| 白城市| 乌恰县| 乃东县| 咸阳市| 三河市| 崇明县| 遂平县| 额尔古纳市| 墨玉县| 黎川县| 阿瓦提县| 石楼县| 广宗县| 邢台市| 金坛市| 莱阳市| 洛川县| 太康县| 阿克苏市| 淮滨县| 泸定县|