C 使用Interlocked進行原子操作

2021-08-10 18:45:26 字數 1277 閱讀 9899

什麼是原子操作?

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

例如:intresult =0;

多執行緒a正在執行result(0)+1

多執行緒b同時執行result(0)+1

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

使用interlocked進行原子操作:

使用.net提供的interlocked類可以對一些資料進行原子操作,看起來似乎跟lock鎖一樣,但它並不是lock鎖,它的原子操作是基於cpu本身的,非阻塞的,所以要比lock的效率高。

下面使用c#**進行演示了原子操作:

1

class

program

2, i);22}

2324

task.waitall(_tasks);

25console.writeline(_result);

2627

console.readkey();28}

29}3031

//執行緒呼叫方法

32private

static

void work(int

taskid)

3339

}40 }

以上**執行分別注釋最後兩行**_result++;interlocked.increment(ref _result);的其中一行再執行,執行後按住enter鍵不放執行數秒,即可看出區別兩者的區別。

關於原子操作的其他說明:在32位cpu執行賦值指令,資料傳輸最大寬度4個位元組。所以只要在4個位元組以下讀寫操作的,32位cpu都是原子操作。所以boolint這些型別的操作本身就是原子操作。而interlocked提供的原子操作方法則是底層進行了功能性cpu指令封裝來完成的。

使用Interlocked進行數字的原子操作

net 的interlocked 方法提供了一些方法進行數字的原子加減和賦值,例如 increment,decrement 和 and 方法,但是還遠遠不夠,所以 net via c 書中提到了 interlocked anything 模式,書中通過 compareexchange 方法實現了乙個...

WPF使用IDataErrorInfo進行資料校驗

原文 wpf使用idataerrorinfo進行資料校驗 這篇部落格將介紹如何使用idataerrorinfo進行資料校驗。下面直接看例子。乙個customer類,兩個屬性 firstname,age class customer public intage 將customer類繼承idataerr...

WPF使用IDataErrorInfo進行資料校驗

原文 wpf使用idataerrorinfo進行資料校驗 這篇部落格將介紹如何使用idataerrorinfo進行資料校驗。下面直接看例子。乙個customer類,兩個屬性 firstname,age class customer public intage 將customer類繼承idataerr...