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

            文章均收錄自他人博客,但不喜標題前加-[轉貼],因其丑陋,見諒!~
            隨筆 - 1469, 文章 - 0, 評論 - 661, 引用 - 0
            數據加載中……

            循環原子鎖

            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能夠以原子操作方式用第二個參數中傳遞的值來取代第一個參數中傳遞的當前值。如果是3 2位應用程序,兩個函數都能用另一個3 2位值取代一個3 2位值。但是,如果是個6 4位應用程序,那么I n t e r l o c k e d E x c h a n g e能夠取代一個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位值。兩個函數都返回原始值。當實現一個循環鎖時,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循環是循環運行的,它將g _ f R e s o u r c e I n U s e中的值改為T R U E,并查看它的前一個值,以了解它是否是T R U E。如果這個值原先是FA L S E,那么該資源并沒有在使用,而是調用線程將它設置為在用狀態并退出該循環。如果前一個值是T R U E,那么資源正在被另一個線程使用,w h i l e循環將繼續循環運行。

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

            當使用這個方法時必須格外小心,因為循環鎖會浪費C P U時間。C P U必須不斷地比較兩個值,直到一個值由于另一個線程而“奇妙地”改變為止。另外,該代碼假定使用循環鎖的所有線程都以相同的優先級等級運行。也可以把執行循環鎖的線程的優先級提高功能禁用(通過調用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函數來實現之)

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

            應該避免在單個C P U計算機上使用循環鎖。如果一個線程正在循環運行,它就會浪費前一個C P U時間,這將防止另一個線程修改該值。我在上面的w h i l e循環中使用了S l e e p ,從而在某種程度上解決了浪費C P U時間的問題。如果使用S l e e p,你可能想睡眠一個隨機時間量;每次請求訪問該資源均被拒絕時,你可能想進一步延長睡眠時間。這可以防止線程浪費C P U時間。根據情況,最好是全部刪除對S l e e p的調用?;蛘呤褂脤 w i t c h To T h r e a d(Windows 98中沒有這個函數)的調用來取代它。勇于試驗和不斷糾正錯誤,是學習的最好方法。

            循環鎖假定,受保護的資源總是被訪問較短的時間。這使它能夠更加有效地循環運行,然后轉為內核方式并進入等待狀態。許多編程人員循環運行一定的次數(比如4 0 0次),如果對資源的訪問仍然被拒絕,那么該線程就轉為內核方式,在這種方式下,它要等待(不消耗C P U時間),直到該資源變為可供使用為止。這就是關鍵部分實現的方法。

            循環鎖在多處理器計算機上非常有用,因為當一個線程循環運行的時候,另一個線程可以在另一個C P U上運行。但是,即使在這種情況下,也必須小心。不應該讓線程循環運行太長的時間,也不能浪費更多的C P U時間。本章后面將進一步介紹循環鎖。

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

            評論

            # re: 循環原子鎖[未登錄]  回復  更多評論   

            問下為什么要刪除sleep,改用SwitchToThread,不擔心他對cpu的占用嗎?
            2013-01-15 15:06 | Bin
            国产99久久久国产精品~~牛| 日日狠狠久久偷偷色综合0| 久久99亚洲网美利坚合众国| 一本久久精品一区二区| 一本一道久久综合狠狠老| 久久ww精品w免费人成| 国产成人精品久久亚洲高清不卡 国产成人精品久久亚洲高清不卡 国产成人精品久久亚洲 | 久久97久久97精品免视看| 日韩AV毛片精品久久久| 日产精品久久久久久久性色| 久久美女网站免费| 99精品国产99久久久久久97| 热久久国产精品| 99久久国产亚洲综合精品| 久久精品国产亚洲网站| 久久综合久久综合亚洲| 91久久精品国产91性色也| 久久精品国产亚洲AV香蕉| 99久久人人爽亚洲精品美女| 久久久久亚洲Av无码专| 久久午夜福利无码1000合集| 国产精品成人99久久久久91gav| 伊人久久久AV老熟妇色| 亚洲国产成人久久综合野外| 93精91精品国产综合久久香蕉| 99久久做夜夜爱天天做精品| 久久久久国产成人精品亚洲午夜| 97精品伊人久久大香线蕉app| 精品国产日韩久久亚洲| 久久五月精品中文字幕| 久久久久久国产a免费观看不卡| 久久成人影院精品777| 国产午夜精品久久久久免费视| 亚洲综合伊人久久综合| 中文字幕无码久久人妻| 无码任你躁久久久久久老妇| 欧美大战日韩91综合一区婷婷久久青草| 国内精品欧美久久精品| 丁香久久婷婷国产午夜视频| 久久99精品国产麻豆不卡| 久久免费视频一区|