国产精品天干天干,亚洲毛片在线,日韩gay小鲜肉啪啪18禁,女同Gay自慰喷水

歡迎光臨散文網(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


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

分享到微博請遵守國家法律
正镶白旗| 密云县| 杂多县| 吉水县| 江永县| 奉贤区| 政和县| 吉首市| 乌兰县| 宜良县| 甘谷县| 临洮县| 金昌市| 瓮安县| 平昌县| 巴南区| 云龙县| 临汾市| 开封县| 宜宾县| 云林县| 嘉义县| 澜沧| 鸡泽县| 宁晋县| 上栗县| 于田县| 和林格尔县| 钟山县| 于田县| 金阳县| 沈阳市| 四平市| 道真| 常州市| 台南县| 辰溪县| 乌拉特后旗| 阿荣旗| 杭锦旗| 曲周县|