程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> C#線程資源同步方式總結(1)

C#線程資源同步方式總結(1)

編輯:關於C語言

在現代的程序開發中,資源的同步是一個比較重要的課題,在.Net中,對這部分有很豐富類庫供我們使用,現在總結一下在各種情況下對資源同步的機制。

1.將字段聲明為volatile

當一個字段被聲明為volatile時,CLR中一些管理代碼和內存的內部機制將負責對字段進行同步,並且總能保證讀取到的字段信息都為最新的值,被聲明為 volatile的字段必須具備以下特征之一

1.為引用類型

2.一個指針(在不安全代碼中)

3.sbyte,byte,short,ushort,int,uint,char,float,bool

4.一個使用底層類型的枚舉類型

2.使用System.Threading.Interlocked 類

在許多增對整數的操作中,我們都比較容易忽視線程的問題,例如執行下列代碼

i = i + 1;

實際上,上述代碼分為3步驟

1).從內存中,讀取i的值

2).將讀取出來的值加1

3).將新的值寫入內存中

在單線程上,這個操作不會有任何問題,但是當i被多個線程訪問時,問題就出現了,對i進行修改的線程,在上述的任何一部都有可能被其它讀取線程打斷,想象一下, 當操作線程執行完第二步,准備將新的值寫入內存中時,此時其它讀取線程獲得了執行權,這時讀取到的i的值並不是我們想要的,因此,這個操作不具備原子性,在.Net中,使用Interlocked類能確保操作的原子性,Interlocked類有以下的方法

Increment

Decrement

Exchange

上述的方法的參數都為帶ref 標識的參數,因此我們說,這些方法保證了數據的原子性,在多線程中,涉及到整數的操作時,數據的原子性值得考慮,Interlocked的操作代碼如下

int i = 0;
System.Threading.Interlocked.Increment(ref i);
Console.WriteLine(i);
System.Threading.Interlocked.Decrement(ref i);
Console.WriteLine(i);
System.Threading.Interlocked.Exchange(ref i, 100);
Console.WriteLine(i);

輸出信息如下

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved