實(shí)現(xiàn)數(shù)的原子性加減。什么是原子性的加減呢?
InterLockedIncrement
舉個(gè)例子:如果一個(gè)變量 Long value =0;
首先說(shuō)一下正常情況下的加減操作:value+=1;
1:系統(tǒng)從Value的空間取出值,并動(dòng)態(tài)生成一個(gè)空間來(lái)存儲(chǔ)取出來(lái)的值;
2:將取出來(lái)的值和1作加法,并且將和放回Value的空間覆蓋掉原值。加法結(jié)束。
如果此時(shí)有兩個(gè)Thread ,分別記作threadA,threadB。
1:threadA將Value從存儲(chǔ)空間取出,為0;
2:threadB將Value從存儲(chǔ)空間取出,為0;
3:threadA將取出來(lái)的值和1作加法,并且將和放回Value的空間覆蓋掉原值。加法結(jié)束,Value=1。
4:threadB將取出來(lái)的值和1作加法,并且將和放回Value的空間覆蓋掉原值。加法結(jié)束,Value=1。
最后Value =1 ,而正確應(yīng)該是2;這就是問(wèn)題的所在,InterLockedIncrement 能夠保證在一個(gè)線程訪問(wèn)變量時(shí)其它線程不能訪問(wèn)。
例:如果 static long addref=0; 則 InterlockedIncrement(&addref); 后 addref=1
InterLockedDecrement
LONG InterlockedDecrement(
LPLONG lpAddend // variable address
);
屬于互鎖函數(shù),用在同一進(jìn)程內(nèi),需要對(duì)共享的一個(gè)變量,做減法的時(shí)候,
防止其他線程訪問(wèn)這個(gè)變量,是實(shí)現(xiàn)線程同步的一種辦法(互鎖函數(shù))
首先要理解多線程同步,共享資源(同時(shí)訪問(wèn)全局變量的問(wèn)題),否則就難以理解。
result = InterlockedDecrement(&SomeInt)
如果不考慮多線程其實(shí)就是 result = SomeInt - 1;
但是考慮到多線程問(wèn)題就復(fù)雜了一些。就是說(shuō)如果想要得到我預(yù)期的結(jié)果并不容易。
result = SomeInt - 1;
舉例說(shuō):
SomeInt如果==1;
預(yù)期的結(jié)果result當(dāng)然==0;
但是,如果SomeInt是一個(gè)全程共享的全局變量情況就不一樣了。
C語(yǔ)言的"result = SomeInt - 1;"
在實(shí)際的執(zhí)行過(guò)程中,有好幾條指令,在指令執(zhí)行過(guò)程中,其它線程可能改變SomeInt值,使真正的結(jié)果與你預(yù)期的不一致。
所以InterlockedDecrement(&SomeInt)的執(zhí)行過(guò)程是這樣的
{
__禁止其他線程訪問(wèn) (&SomeInt) 這個(gè)地址
SomeInt --;
move EAX, someInt; // 設(shè)定返回值,C++函數(shù)的返回值 都放在EAX中,
__開(kāi)放其他線程訪問(wèn) (&SomeInt) 這個(gè)地址
}
但是實(shí)際上只需要幾條指令加前綴就可以完成,以上說(shuō)明是放大的。
你也許會(huì)說(shuō),這有必要嗎? 一般來(lái)說(shuō),發(fā)生錯(cuò)誤的概率不大,但是防范總是必要的


