我們都知道,windows是乙個搶占式的多執行緒環境,因此系統可能會在任意時刻暫停乙個執行緒,切換到另乙個執行緒讓新的執行緒繼續執行。請看這段**:
2個執行緒函式,各有乙個for迴圈,1000w次,那麼,我們或許會認為,最終輸出的 g_x的值會是 1000w+1000w = 20000000?
但是,在多執行緒環境下,是不會達到我們想要的效果的,**可能不會嚴格按照我們想要的順序執行,但執行緒函式1的乙個時間片用完,它或許會去執行執行緒函式2
彙編**是這樣的:
mov eax,[g_x]
inc eax
move eax,[g_x]
inc eax
mov [g_x],eax
mov [g_x],eax
是的,有可能某次或者某幾次的 g_x++的操作會被分解,打斷(解釋下:inc eax 以後,沒有按照預想的繼續執行 mov [g_x],eax,而是跳轉到另外的乙個執行緒,去執行 move eax,[g_x])
因此,我們需要有一種方法能夠保證對乙個值的遞增操作是原子操作:也就是說,操作不會被打斷
我們可以用如下函式
long __cdecl interlockedexchangeadd(__in_out long volatile* addend
, __in long value
);
修改後的**如下:這樣,我們就可以得到正確的結果了!2000w
C 使用Interlocked進行原子操作
什麼是原子操作?原子 atom 本意是 不能被進一步分割的最小粒子 而原子操作 atomic operation 意為 不可被中斷的乙個或一系列操作 在c 中有多個執行緒同時對某個變數進行操作的時候,我們應該使用原子操作,防止多執行緒取到的值不是最新的值。例如 intresult 0 多執行緒a正在...
使用Interlocked進行數字的原子操作
net 的interlocked 方法提供了一些方法進行數字的原子加減和賦值,例如 increment,decrement 和 and 方法,但是還遠遠不夠,所以 net via c 書中提到了 interlocked anything 模式,書中通過 compareexchange 方法實現了乙個...
Interlocked系列函式
1.增減操作 long cdecl interlockedincrement long volatile addend long cdecl interlockeddecrement long volatile addend 返回變數執行增減操作之後的值。long cdec interlockede...