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