最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

秒殺多線程-原子操作

2023-01-30 20:55 作者:ベ計院小白隆ミ  | 我要投稿

前面章節(jié):



原子操作 Interlocked系列函數(shù)

對于多線程報數(shù)功能,為了描述方便和代碼簡潔起見,我們可以只輸出最后的報數(shù)結(jié)果來觀察程序是否運行出錯。這也非常類似于統(tǒng)計一個網(wǎng)站每天有多少用戶登錄,每個用戶登錄用一個線程模擬,線程運行時會將一個表示計數(shù)的變量遞增。程序在最后輸出計數(shù)的值表示有今天多少個用戶登錄,如果這個值不等于我們啟動的線程個數(shù),那顯然說明這個程序是有問題的。整個程序代碼如下:

程序輸出的結(jié)果好象并沒什么問題。下面增加點用戶來試試,現(xiàn)在模擬50個用戶登錄,為了便于觀察結(jié)果,在程序中將50個用戶登錄過程重復(fù)20次,代碼如下:

可以發(fā)現(xiàn)輸出結(jié)果是不確定的。查看g_iLoginCount++;操作的匯編代碼(VS可以調(diào)試查看):

g_iLoginCount++;操作的匯編代碼

第一條匯編就是將g_iLoginCount的值讀取到寄存器eax中第二條匯編就是將寄存器eax的值與1相加,并將結(jié)果存入寄存器eax中第三條匯編就是將寄存器eax中的值寫回內(nèi)存中

這樣由于線程執(zhí)行的并發(fā)性,很可能線程A執(zhí)行到第二句時,線程B開始執(zhí)行,線程B將原來的值又寫入寄存器eax中,這樣線程A所主要計算的值就被線程B修改了。這樣執(zhí)行下來,結(jié)果是不可預(yù)知的——可能會出現(xiàn)50,可能小于50。

因此在多線程環(huán)境中對一個變量進行讀寫時,需要有一種方法能夠保證對一個值的遞增操作是原子操作——即不可打斷性,一個線程在執(zhí)行原子操作時,其它線程必須等待它完成之后才能開始執(zhí)行該原子操作。Windows系統(tǒng)提供了一些以Interlocked開頭的函數(shù)來完成這一任務(wù)(Interlocked系列函數(shù))。

常用的Interlocked系列函數(shù):

1.遞增/減

2.指定增加或減少的值

3.賦值

修改代碼:

InterlockedIncrement((LPLONG)&g_iLoginCount);的匯編代碼

只有一條匯編

引入原子操作運行結(jié)果

因此,在多線程環(huán)境下,我們對變量的自增自減這些簡單的語句也要慎重思考,防止多個線程導(dǎo)致的數(shù)據(jù)訪問出錯。更多介紹,請訪問http://msdn.microsoft.com/zh-cn/library/aa909196.aspx

如果模擬100個用戶登錄會有意想不到的結(jié)果,可以試試,看一下運行結(jié)果


下一篇介紹一個經(jīng)典的多線程問題


參考:https://blog.csdn.net/morewindows/article/details/7429155


秒殺多線程-原子操作的評論 (共 條)

分享到微博請遵守國家法律
壤塘县| 靖边县| 万宁市| 双流县| 古丈县| 南木林县| 汕尾市| 上杭县| 当涂县| 曲沃县| 香河县| 迁西县| 黔南| 竹北市| 金山区| 香格里拉县| 抚宁县| 白山市| 宾阳县| 阿荣旗| 鄂州市| 铜山县| 郁南县| 施秉县| 武威市| 无锡市| 即墨市| 阳谷县| 疏附县| 铁岭市| 阜新| 盘锦市| 巴楚县| 朝阳市| 尤溪县| 凭祥市| 盐边县| 林周县| 尼玛县| 天等县| 册亨县|