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

2022-09-19 15:57:09 字數 1553 閱讀 3367

.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 ...