• <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>

            woaidongmao

            文章均收錄自他人博客,但不喜標(biāo)題前加-[轉(zhuǎn)貼],因其丑陋,見諒!~
            隨筆 - 1469, 文章 - 0, 評(píng)論 - 661, 引用 - 0
            數(shù)據(jù)加載中……

            循環(huán)原子鎖

            In t e r l o c k e d E x c h a n g e和I n t e r l o c k e d E x c h a n g e P o i n t e r能夠以原子操作方式用第二個(gè)參數(shù)中傳遞的值來(lái)取代第一個(gè)參數(shù)中傳遞的當(dāng)前值。如果是3 2位應(yīng)用程序,兩個(gè)函數(shù)都能用另一個(gè)3 2位值取代一個(gè)3 2位值。但是,如果是個(gè)6 4位應(yīng)用程序,那么I n t e r l o c k e d E x c h a n g e能夠取代一個(gè)3 2位值,而I n t e r l o c k e d E x c h a n g e P o i n t e r則取代6 4位值。兩個(gè)函數(shù)都返回原始值。當(dāng)實(shí)現(xiàn)一個(gè)循環(huán)鎖時(shí),I n t e r l o c k e d E x c h a n g e是非常有用的:

            // Global variable indicating whether a shared resource is in use or not
            BOOL g_fResourceInUse = FALSE;
            ...
            
            void Func1() 
            {
               //Wait to access the resource.
               while(InterlockedExchange(&g_fResourceInUse, TRUE) == TRUE)
                  Sleep(0);
            
               //Access the resource.
            
               ...
            
               //We no longer need to access the resource.
               InterlockedExchange(&g_fResourceInUse, FALSE);
            }

            w h i l e循環(huán)是循環(huán)運(yùn)行的,它將g _ f R e s o u r c e I n U s e中的值改為T R U E,并查看它的前一個(gè)值,以了解它是否是T R U E。如果這個(gè)值原先是FA L S E,那么該資源并沒有在使用,而是調(diào)用線程將它設(shè)置為在用狀態(tài)并退出該循環(huán)。如果前一個(gè)值是T R U E,那么資源正在被另一個(gè)線程使用,w h i l e循環(huán)將繼續(xù)循環(huán)運(yùn)行。

            如果另一個(gè)線程要執(zhí)行類似的代碼,它將在w h i l e循環(huán)中運(yùn)行,直到g _ f R e s o u r c e I n U s e重新改為FA L S E。調(diào)用函數(shù)結(jié)尾處的I n t e r l o c k e d E x c h a n g e,可顯示應(yīng)該如何將g _ f R e s o u r c e I n U s e重新設(shè)置為FA L S E。

            當(dāng)使用這個(gè)方法時(shí)必須格外小心,因?yàn)檠h(huán)鎖會(huì)浪費(fèi)C P U時(shí)間。C P U必須不斷地比較兩個(gè)值,直到一個(gè)值由于另一個(gè)線程而“奇妙地”改變?yōu)橹埂A硗猓摯a假定使用循環(huán)鎖的所有線程都以相同的優(yōu)先級(jí)等級(jí)運(yùn)行。也可以把執(zhí)行循環(huán)鎖的線程的優(yōu)先級(jí)提高功能禁用(通過(guò)調(diào)用S e t P r o c e s s P r i o r i t y B o o s t或s e t T h r e a d P r i o r i t y B o o s t函數(shù)來(lái)實(shí)現(xiàn)之)

            此外,應(yīng)該保證將循環(huán)鎖變量和循環(huán)鎖保護(hù)的數(shù)據(jù)維護(hù)在不同的高速緩存行中(本章后面部分介紹)。如果循環(huán)鎖變量與數(shù)據(jù)共享相同的高速緩存行,那么使用該資源的C P U將與試圖訪問該資源的任何C P U爭(zhēng)用高速緩存行。

            應(yīng)該避免在單個(gè)C P U計(jì)算機(jī)上使用循環(huán)鎖。如果一個(gè)線程正在循環(huán)運(yùn)行,它就會(huì)浪費(fèi)前一個(gè)C P U時(shí)間,這將防止另一個(gè)線程修改該值。我在上面的w h i l e循環(huán)中使用了S l e e p ,從而在某種程度上解決了浪費(fèi)C P U時(shí)間的問題。如果使用S l e e p,你可能想睡眠一個(gè)隨機(jī)時(shí)間量;每次請(qǐng)求訪問該資源均被拒絕時(shí),你可能想進(jìn)一步延長(zhǎng)睡眠時(shí)間。這可以防止線程浪費(fèi)C P U時(shí)間。根據(jù)情況,最好是全部刪除對(duì)S l e e p的調(diào)用。或者使用對(duì)S w i t c h To T h r e a d(Windows 98中沒有這個(gè)函數(shù))的調(diào)用來(lái)取代它。勇于試驗(yàn)和不斷糾正錯(cuò)誤,是學(xué)習(xí)的最好方法。

            循環(huán)鎖假定,受保護(hù)的資源總是被訪問較短的時(shí)間。這使它能夠更加有效地循環(huán)運(yùn)行,然后轉(zhuǎn)為內(nèi)核方式并進(jìn)入等待狀態(tài)。許多編程人員循環(huán)運(yùn)行一定的次數(shù)(比如4 0 0次),如果對(duì)資源的訪問仍然被拒絕,那么該線程就轉(zhuǎn)為內(nèi)核方式,在這種方式下,它要等待(不消耗C P U時(shí)間),直到該資源變?yōu)榭晒┦褂脼橹埂_@就是關(guān)鍵部分實(shí)現(xiàn)的方法。

            循環(huán)鎖在多處理器計(jì)算機(jī)上非常有用,因?yàn)楫?dāng)一個(gè)線程循環(huán)運(yùn)行的時(shí)候,另一個(gè)線程可以在另一個(gè)C P U上運(yùn)行。但是,即使在這種情況下,也必須小心。不應(yīng)該讓線程循環(huán)運(yùn)行太長(zhǎng)的時(shí)間,也不能浪費(fèi)更多的C P U時(shí)間。本章后面將進(jìn)一步介紹循環(huán)鎖。

            posted on 2008-04-16 15:02 肥仔 閱讀(1292) 評(píng)論(1)  編輯 收藏 引用 所屬分類: Windows開發(fā)

            評(píng)論

            # re: 循環(huán)原子鎖[未登錄]  回復(fù)  更多評(píng)論   

            問下為什么要?jiǎng)h除sleep,改用SwitchToThread,不擔(dān)心他對(duì)cpu的占用嗎?
            2013-01-15 15:06 | Bin
            伊人久久大香线蕉AV色婷婷色| 日韩一区二区久久久久久| 天堂无码久久综合东京热| 伊人久久亚洲综合影院| 久久国产欧美日韩精品| 久久97精品久久久久久久不卡| 国产精品热久久毛片| 亚洲国产综合久久天堂| 一本久道久久综合狠狠爱| 中文字幕成人精品久久不卡| 亚洲午夜精品久久久久久app| 久久综合88熟人妻| 国产精品久久久久乳精品爆 | 久久这里的只有是精品23| 性欧美大战久久久久久久久| 青青青伊人色综合久久| 久久久久亚洲av综合波多野结衣 | 久久AV高潮AV无码AV| 97r久久精品国产99国产精| 欧洲国产伦久久久久久久| 国产成人精品久久免费动漫| 久久久久99这里有精品10| 婷婷久久综合九色综合98| 久久精品国产99国产精品亚洲| 国产毛片久久久久久国产毛片 | 久久亚洲2019中文字幕| 国产成人久久AV免费| 99久久精品免费看国产一区二区三区 | 伊人久久大香线蕉av不变影院| 国产伊人久久| 久久综合欧美成人| 国内精品久久久久| 亚洲精品tv久久久久久久久| 久久亚洲精品无码aⅴ大香 | 久久久久无码精品国产不卡| 久久久久久久波多野结衣高潮| 尹人香蕉久久99天天拍| 久久精品视频一| 亚洲国产欧洲综合997久久| 精品国产青草久久久久福利| 日本五月天婷久久网站|