秒殺多線程-原子操作


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

查看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ù))。
1.遞增/減
2.指定增加或減少的值
3.賦值
修改代碼:

只有一條匯編

因此,在多線程環(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