什麼是原子操作?
原子(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都是原子操作。所以bool
、int
這些型別的操作本身就是原子操作。而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...