• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            唐吉訶德

              C++博客 :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
              5 Posts :: 75 Stories :: 3 Comments :: 0 Trackbacks

            常用鏈接

            留言簿(2)

            我參與的團(tuán)隊

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

            實現(xiàn)數(shù)的原子性加減。什么是原子性的加減呢?

            InterLockedIncrement
            舉個例子:如果一個變量 Long value =0;

            首先說一下正常情況下的加減操作:value+=1;

            1:系統(tǒng)從Value的空間取出值,并動態(tài)生成一個空間來存儲取出來的值;

            2:將取出來的值和1作加法,并且將和放回Value的空間覆蓋掉原值。加法結(jié)束。


            如果此時有兩個Thread ,分別記作threadA,threadB。

            1:threadA將Value從存儲空間取出,為0;

            2:threadB將Value從存儲空間取出,為0;

            3:threadA將取出來的值和1作加法,并且將和放回Value的空間覆蓋掉原值。加法結(jié)束,Value=1。

            4:threadB將取出來的值和1作加法,并且將和放回Value的空間覆蓋掉原值。加法結(jié)束,Value=1。

            最后Value =1 ,而正確應(yīng)該是2;這就是問題的所在,InterLockedIncrement 能夠保證在一個線程訪問變量時其它線程不能訪問。
            例:如果 static long addref=0; 則 InterlockedIncrement(&addref); 后 addref=1
            InterLockedDecrement

            LONG   InterlockedDecrement(  
                  LPLONG   lpAddend       //   variable   address  
            );  
            屬于互鎖函數(shù),用在同一進(jìn)程內(nèi),需要對共享的一個變量,做減法的時候,  
            防止其他線程訪問這個變量,是實現(xiàn)線程同步的一種辦法(互鎖函數(shù))
              
            首先要理解多線程同步,共享資源(同時訪問全局變量的問題),否則就難以理解。  
                
            result   =   InterlockedDecrement(&SomeInt)  
                
            如果不考慮多線程其實就是   result   =   SomeInt   -   1;  
                
            但是考慮到多線程問題就復(fù)雜了一些。就是說如果想要得到我預(yù)期的結(jié)果并不容易。  
                
            result   =   SomeInt   -   1;  
                
            舉例說:  
            SomeInt如果==1;  
            預(yù)期的結(jié)果result當(dāng)然==0;  
                
            但是,如果SomeInt是一個全程共享的全局變量情況就不一樣了。  
            C語言的"result   =   SomeInt   -   1;"  
            在實際的執(zhí)行過程中,有好幾條指令,在指令執(zhí)行過程中,其它線程可能改變SomeInt值,使真正的結(jié)果與你預(yù)期的不一致。  
                
            所以InterlockedDecrement(&SomeInt)的執(zhí)行過程是這樣的  
            {  
                  __禁止其他線程訪問   (&SomeInt)   這個地址  
                
                  SomeInt   --;  
                    
                  move   EAX,   someInt;   //   設(shè)定返回值,C++函數(shù)的返回值   都放在EAX中,  
                
                  __開放其他線程訪問   (&SomeInt)   這個地址  
            }  
                
            但是實際上只需要幾條指令加前綴就可以完成,以上說明是放大的。  
                
            你也許會說,這有必要嗎?   一般來說,發(fā)生錯誤的概率不大,但是防范總是必要的

            例:如果 static long addref=0; 則 InterlockedDecrement(&addref); 后 addref=-1
            posted on 2010-12-15 09:55 心羽 閱讀(1781) 評論(0)  編輯 收藏 引用 所屬分類: multithread
            国产成人精品久久免费动漫| 丁香五月网久久综合| 国产精品岛国久久久久| 四虎国产精品免费久久5151| 久久精品国产只有精品66| 久久天天躁狠狠躁夜夜不卡| 亚洲午夜久久久久妓女影院 | 久久99热只有频精品8| 久久久99精品成人片中文字幕| 精品无码久久久久久久动漫| 久久亚洲AV成人无码电影| 久久久91人妻无码精品蜜桃HD| 久久99热这里只有精品国产| 久久精品国产一区二区电影| 久久精品无码午夜福利理论片| 一级做a爰片久久毛片免费陪| 久久久99精品一区二区| 精品免费久久久久久久| 日本高清无卡码一区二区久久| 精品国产91久久久久久久a| 97精品国产97久久久久久免费| 久久99中文字幕久久| 丁香狠狠色婷婷久久综合| 日韩精品久久久久久久电影| 久久精品中文字幕有码| 99久久99这里只有免费的精品| 久久久久亚洲av成人网人人软件| 94久久国产乱子伦精品免费| 成人a毛片久久免费播放| 99久久精品免费观看国产| 久久精品水蜜桃av综合天堂| 亚洲国产精品无码久久一线| 欧美一区二区三区久久综| 中文字幕无码久久久| 久久综合伊人77777麻豆| 久久成人国产精品一区二区| 99久久国产综合精品五月天喷水| 99麻豆久久久国产精品免费| 国产精品久久久久影院嫩草| 久久最新精品国产| 日韩一区二区久久久久久|