.net
的interlocked
方法提供了一些方法進行數字的原子加減和賦值,例如
increment, decrement
和 and
方法,但是還遠遠不夠,所以
.net via c#
書中提到了
interlocked anything
模式, 書中通過
compareexchange
方法實現了乙個樂觀鎖來進行
interlocked anything.
當共享變數被更新的不頻繁的時候,使用樂觀鎖要比直接使用
lock
效率高很多,因為無需獲取鎖,所以
jeffery ritcher
說他經常使用,我以前在
threadpool
這個類的源**中也看到了使用
compareexchange
來進行原子操作。
所謂樂觀鎖的邏輯很簡單,即先操作,等提交時再檢查是否可以提交。基本流程圖如下。
邏輯雖然很簡單,但是多執行緒環境下以下兩步操作,
1. 檢查到共享變數沒有被別的執行緒更改。
2. 如果沒有被更改則更新共享變數。 這兩步操作應該是個原子操作,否則會出現兩個執行緒同時更新共享變數的情況。
interlocked
提供的compareexchange
方法正好可以符合這種情形。
public static float compareexchange (ref float location1, float value, float comparand);這個方法基本的邏輯的偽**如下,但是整個操作是原子的。
public int compareexchangelogic(ref int location1, int value, int comparand)方法無論如何都會返回return oldlocation1value;
}
location1
的舊值,因此我們可以根據返回值來判斷共享變數有沒有被別人更新(如果有,我們只能重新獲取最新的共享變數值然後再重新計算),寫好的**並且測試的**為
internal class program}));
}task.waitall(tasklist.toarray());
console.writeline(valuetoupdate);
}/// /// 更新共享變數value.
///
/// 要更新的變數
/// 對這個變數要進行的計算操作
public static void updatevalue(ref int value, funccalculatefunc)
while (interlocked.compareexchange(ref value, calculatedvalue, oldvalue) != oldvalue);}}
C 使用Interlocked進行原子操作
什麼是原子操作?原子 atom 本意是 不能被進一步分割的最小粒子 而原子操作 atomic operation 意為 不可被中斷的乙個或一系列操作 在c 中有多個執行緒同時對某個變數進行操作的時候,我們應該使用原子操作,防止多執行緒取到的值不是最新的值。例如 intresult 0 多執行緒a正在...
Interlocked系列函式
1.增減操作 long cdecl interlockedincrement long volatile addend long cdecl interlockeddecrement long volatile addend 返回變數執行增減操作之後的值。long cdec interlockede...
Interlocked系列互鎖函式
增減 1 long interlockedincrement in out long volatile lpaddend lpaddend為長整型變數的位址,返回值為原始值。這個函式的主要作用是原子性自增 相當於 操作 2 long interlockeddecrement in out long ...