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

首頁 > 編程 > C# > 正文

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

2019-10-29 21:18:22
字體:
來源:轉載
供稿:網友

什么是原子操作?

原子(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進行原子操作的技巧,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對VEVB武林網網站的支持!


注:相關教程知識閱讀請移步到c#教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 郧西县| 六枝特区| 钟山县| 朝阳区| 鲁山县| 蒙自县| 达孜县| 武清区| 阜康市| 雅安市| 长兴县| 轮台县| 屯昌县| 怀远县| 兴海县| 通许县| 垣曲县| 长乐市| 仁化县| 巧家县| 宾川县| 洱源县| 正阳县| 长宁县| 丰顺县| 大田县| 明光市| 大同县| 潞西市| 广德县| 同心县| 渑池县| 涞水县| 鄄城县| 晴隆县| 沛县| 黄浦区| 西丰县| 营口市| 涡阳县| 酉阳|