• <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 肥仔 閱讀(1463) 評論(0)  編輯 收藏 引用 所屬分類: Windows開發

            久久久久国产一区二区| 色88久久久久高潮综合影院| 狠狠久久综合伊人不卡| 久久久精品视频免费观看| 日韩精品无码久久一区二区三| 国色天香久久久久久久小说| 日本精品久久久久中文字幕8| 少妇被又大又粗又爽毛片久久黑人| 亚洲精品蜜桃久久久久久| 久久精品中文字幕一区| 久久精品人人槡人妻人人玩AV| 国内精品久久久久国产盗摄| 国内精品九九久久久精品| 亚洲欧美精品一区久久中文字幕| 97久久精品人妻人人搡人人玩| 日韩久久无码免费毛片软件| 久久99精品国产99久久6男男| 久久笫一福利免费导航 | 热re99久久6国产精品免费| 久久精品成人免费网站| 亚洲级αV无码毛片久久精品| 合区精品久久久中文字幕一区| 精品精品国产自在久久高清| 久久精品国产亚洲AV蜜臀色欲| 精品久久人人爽天天玩人人妻| 久久精品水蜜桃av综合天堂 | 久久亚洲中文字幕精品有坂深雪 | 久久精品亚洲精品国产欧美| 久久久久久久亚洲Av无码| 国内精品久久国产| 久久久久噜噜噜亚洲熟女综合| 国产亚洲婷婷香蕉久久精品| 久久精品国产亚洲av麻豆小说| 中文国产成人精品久久不卡| 久久只有这里有精品4| 亚洲精品乱码久久久久久蜜桃| 久久九九久精品国产| 久久国产视屏| 久久亚洲精品无码观看不卡| 欧美久久天天综合香蕉伊| 亚洲午夜福利精品久久|