• <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
            數據加載中……

            WaitForSingleObject 和 EnterCriticalSection 效率比較

            Microsoft Windows 平臺中兩種最常用的鎖定方法為 WaitForSingleObject EnterCriticalSectionWaitForSingleObject 是一個過載 Microsoft API,可用于檢查和修改許多不同對象(如事件、作業、互斥體、進程、信號、線程或計時器)的狀態。WaitForSingleObject 的一個不足之處是它會始終獲取內核的鎖定,因此無論是否獲得鎖定,它都會進入特權模式 (環路 0)。此 API 還進入 Windows 內核,即使指定的超時為 0,亦如此。此鎖定方法的另一不足之處在于,它一次只能處理 64 個嘗試對某個對象進行鎖定的線程。WaitForSingleObject 的優點是它可以全局進行處理,這使得此 API 能夠用于進程間的同步。它還具有為操作系統提供鎖定對象信息的優勢,從而可以實現公平性及優先級倒置。

            通過對關鍵代碼段實施 EnterCriticalSection LeaveCriticalSection API 調用,可以使用 EnterCriticalSection。此 API 具有 WaitForSingleObject 所不具備的優點,因為只有存在鎖定爭用時,才會進入內核。如果不存在鎖定爭用,則此 API 會獲取用戶空間鎖定,并且在未進入特權模式的情況下返回。如果存在爭用,則此 API 在內核中所采用的路徑將與 WaitForSingleObject 極其相似。在低爭用的情況下,由于 EnterCriticalSection 不進入內核,因此鎖定開銷非常低。

            不足之處是 EnterCriticalSection 無法進行全局處理,因此無法為線程獲取鎖定的順序提供任何保證。EnterCriticalSection 是一種阻塞調用,意味著只有線程獲得對此關鍵區段的訪問權限時,該調用才會返回。Windows 引入了 TryEnterCriticalSectionTryEnterCriticalSection 是一種非阻塞調用,無論獲得鎖定與否都會立即返回。此外,EnterCriticalSection 還允許開發人員使用自旋計數對關鍵區段進行初始化,在回退前線程會按此自旋計數嘗試獲取鎖定。通過使用 API InitializeCriticalSectionAndSpinCount,完成初始化。自旋計數可以在此調用中進行設置,也可以在注冊表中進行設置,以根據不同操作系統及其相應的線程量程對自旋進行更改。

            如果存在鎖定爭用,則 EnterCriticalSection WaitForSingleObject 都會進入內核。如果實現程度過高,從用戶模式到特權模式的轉換開銷將會非常大。

            EnterCriticalSection
            WaitForSingleObject API 調用在對使用數千個周期的運算進行鎖定時,通常不會影響性能。在這些情況下,鎖定調用本身的開銷不會如此突出。會導致性能降低的情況是粒度鎖定,獲得和釋放此鎖定要花費數百個周期。在這些情況下,使用用戶級別鎖定則非常有益。

            為了說明在低爭用的情況下 WaitForSingleObject 調用與 EnterCriticalSection 調用的開銷情況,我們分別在 1 個和 2 個線程上運行了內存管理鎖定內核
            。在低爭用的情況下,存在加速比 (WaitForSingleObject_Time / EnterCriticalSection_Time) 大約為 5 倍的性能之差。在 2 個線程持續爭用的情況下,使用 EnterCriticalSection 和使用 WaitForSingleObject 之間的差別最小。在低爭用的情況下存在性能差距的原因如下:WaitForSingleObject 在每次調用時都進入內核,而 EnterCriticalSection 只有當存在鎖定爭用時,才進入內核。

             

            posted on 2009-09-14 12:58 肥仔 閱讀(1468) 評論(0)  編輯 收藏 引用 所屬分類: Windows開發

            久久亚洲高清观看| 亚洲人成无码网站久久99热国产| 色婷婷综合久久久中文字幕| 国产精品久久久久久| 久久精品亚洲福利| 久久精品国产亚洲AV麻豆网站 | 伊人热热久久原色播放www| 久久综合噜噜激激的五月天| 99久久精品免费国产大片| 亚洲伊人久久精品影院| 精品久久久久久国产三级| AAA级久久久精品无码片| 久久久久亚洲av成人网人人软件| 久久久青草青青亚洲国产免观| 99久久精品国产一区二区| 久久久精品人妻无码专区不卡| 久久久av波多野一区二区| 一本久久精品一区二区| 久久久久这里只有精品| 亚洲国产精久久久久久久| 国内精品人妻无码久久久影院| 久久人人爽人人人人爽AV| 亚洲国产综合久久天堂| 久久精品国产精品亜洲毛片 | 手机看片久久高清国产日韩| 久久久精品免费国产四虎| 精品久久久久久无码专区| 97精品依人久久久大香线蕉97| 久久只有这精品99| 伊人色综合九久久天天蜜桃| 久久久久亚洲AV综合波多野结衣| 国产一区二区精品久久凹凸| 国产成人精品久久亚洲高清不卡| 伊人久久精品线影院| 精品一久久香蕉国产线看播放| 国产精品免费久久久久久久久 | 久久国产三级无码一区二区| 精品久久久久国产免费| 色偷偷88欧美精品久久久| 国内精品久久国产| 亚洲伊人久久大香线蕉综合图片|