InterlockedIncrement函式詳解

2021-12-29 22:16:20 字數 1862 閱讀 7797

interlockedincrement and interlockeddecrement

實現數的原子性加減。什麼是原子性的加減呢?

舉個例子:如果乙個變數 long value =0;

首先說一下正常情況下的加減操作:value+=1;

1:系統從value的空間取出值,並動態生成乙個空間來儲存取出來的值;

2:將取出來的值和1作加法,並且將和放回value的空間覆蓋掉原值。加法結束。

如果此時有兩個thread ,分別記作threada,threadb。

1:threada將value從儲存空間取出,為0;

2:threadb將value從儲存空間取出,為0;

3:threada將取出來的值和1作加法,並且將和放回value的空間覆蓋掉原值。加法結束,value=1。

4:threadb將取出來的值和1作加法,並且將和放回value的空間覆蓋掉原值。加法結束,value=1。

最後value =1 ,而正確應該是2;這就是問題的所在,interlockedincrement 能夠保證在乙個執行緒訪問變數時其它執行緒不能訪問。同理interlockeddecrement。

long   interlockeddecrement(  

lplong   lpaddend       //   variable   address  

);  

屬於互鎖函式,用在同一程序內,需要對共享的乙個變數,做減法的時候,  

防止其他執行緒訪問這個變數,是實現執行緒同步的一種辦法(互鎖函式)

首先要理解多執行緒同步,共享資源(同時訪問全域性變數的問題),否則就難以理解。  

result   =   interlockeddecrement(&someint)  

如果不考慮多執行緒其實就是   result   =   someint   -   1;  

但是考慮到多執行緒問題就複雜了一些。就是說如果想要得到我預期的結果並不容易。  

result   =   someint   -   1;  

舉例說:  

someint如果==1;  

預期的結果result當然==0;  

但是,如果someint是乙個全程共享的全域性變數情況就不一樣了。  

c語言的"result   =   someint   -   1;"  

在實際的執行過程中,有好幾條指令,在指令執行過程中,其它執行緒可能改變someint值,使真正的結果與你預期的不一致。  

所以interlockeddecrement(&someint)的執行過程是這樣的  

但是實際上只需要幾條指令加字首就可以完成,以上說明是放大的。  

你也許會說,這有必要嗎?   一般來說,發生錯誤的概率不大,但是防範總是必要的

如果不考慮多執行緒  

result   =   interlockeddecrement(&someint);  

就是result   =   someint   -   1;  

如果someint==1,result一定==0;  

但是,在多執行緒中如果someint是執行緒間共享的全域性變數,情況就不那麼簡單了。  

result   =   someint   -   1;  

在cpu中,要執行好幾條指令。在指令中間有可能someint被執行緒修改。那實際的結果就不是你預期的結果了。  

interlockeddecrement(&someint)  

放大的過程,如下:  

實際的cpu執行過程只有幾條加字首的指令(586指令)  

你會說,有必要嗎?   出錯的概率不大,但是錯誤總是需要防範的。當然可以用其他多執行緒機制實現,但是都沒有這樣簡潔,所以interlocked...函式有必要提供。

摘自 踏雪無痕

ngx process options函式詳解

ngx process options是初始化init cycle中的一些如 conf file,prefix,conf prefix等字段的功能,其方法的定義在src core nginx.c中,以下為詳細 主要功能是將ngx prefix,配置檔案的位置資訊,以及命令列引數的資訊初始化到cycl...

linux clock gettime函式詳解

注意 1.精確級別,納秒級別 原型long sys clock gettime clockid t which clock,struct timespec tp which clock引數解釋 clock realtime 系統實時時間,隨系統實時時間改變而改變,即從utc1970 1 1 0 0 ...

遞迴函式(詳例)

從函式棧的角度的運用 簡單的列印運用 includevoid function int n int main void function int n return 非空鍊錶的遞迴找最大值 lim findmax lim headptr 為了更好的理解遞迴的執行過程 在呼叫自生到最後時,if head...