日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

InterlockedIncrement函数详解

發布時間:2025/3/21 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 InterlockedIncrement函数详解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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)的執行過程是這樣的 ??
{ ??
? ? ? __禁止其他線程訪問 ? (&SomeInt) ? 這個地址 ??
? ? ?
? ? ? SomeInt ? --; ??
? ? ? ? ?
? ? ? move ? EAX, ? someInt; ? // ? 設定返回值,C++函數的返回值 ? 都放在EAX中, ??
? ? ?
? ? ? __開放其他線程訪問 ? (&SomeInt) ? 這個地址 ??
} ??
? ? ?
但是實際上只需要幾條指令加前綴就可以完成,以上說明是放大的。 ??
? ? ?
你也許會說,這有必要嗎? ? 一般來說,發生錯誤的概率不大,但是防范總是必要的?
如果不考慮多線程 ??
result ? = ? InterlockedDecrement(&SomeInt); ??
就是result ? = ? SomeInt ? - ? 1; ??
如果SomeInt==1,result一定==0; ??
? ? ?
但是,在多線程中如果SomeInt是線程間共享的全局變量,情況就不那么簡單了。 ??
result ? = ? SomeInt ? - ? 1; ??
在CPU中,要執行好幾條指令。在指令中間有可能SomeInt被線程修改。那實際的結果就不是你預期的結果了。 ??
? ? ?
InterlockedDecrement(&SomeInt) ??
放大的過程,如下: ??
{ ??
? ? ? __禁止其他線程訪問 ? &SomeInt ? 地址; ??
? ? ?
? ? ? SomeInt ? --; ??
? ? ? ? ?
? ? ? /其他線程不會在這里修改SomeInt值。 ? !!!!!! ??
? ? ?
? ? ? mov ? EAX, ? SomeInt; ? //C++ ? 函數返回值 ? 總放在EAX中。 ??
? ? ? ? ?
? ? ? __開放其他線程訪問 ? &SomeInt ? 地址; ??
} ??
? ? ?
實際的CPU執行過程只有幾條加前綴的指令(586指令) ??
? ? ?
你會說,有必要嗎? ? 出錯的概率不大,但是錯誤總是需要防范的。當然可以用其他多線程機制實現,但是都沒有這樣簡潔,所以Interlocked...函數有必要提供。
---------------------?
作者:zhongguoren666?
來源:CSDN?
原文:https://blog.csdn.net/zhongguoren666/article/details/7541778?
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!

總結

以上是生活随笔為你收集整理的InterlockedIncrement函数详解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。