青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

woaidongmao

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

幾種線程鎖的效率比較(多線程,鎖,CRITICAL_SECTION)

測試環境Windows XP SP2,Intel Core2 Duo E8400 3.00GHz1.94GB內存

首先使用CRITICAL_SECTION和自旋機制實現:
CRITICAL_SECTION GCritical;
......
InitializeCriticalSectionAndSpinCount(&GCritical, 0x80000FA0);
......
//
線程核心函數,共使用兩個線程
for (int i = 0; i < 100000000; ++i)
{
    EnterCriticalSection(&GCritical);
    ++GlobalSum;
    LeaveCriticalSection(&GCritical);
}
......
DeleteCriticalSection(&GCritical);
實測時間為21.578s

使用CRITICAL_SECTION和非自旋機制:
CRITICAL_SECTION GCritical;
......
InitializeCriticalSection(&GCritical);
......
//
線程核心函數,共使用兩個線程
for (int i = 0; i < 100000000; ++i)
{
    EnterCriticalSection(&GCritical);
    ++GlobalSum;
    LeaveCriticalSection(&GCritical);
}
......
DeleteCriticalSection(&GCritical);
運行時間太長,在運行2分鐘后仍然未運行完畢

可見在大規模并行運算的環境中,如果存在臨界區,自旋鎖的時間開銷遠小于普通的鎖機制。相比于普通鎖,自旋鎖在進入操

作系統內核態之前會進行多次循環,并在循環中嘗試獲取鎖,如果在循環過程中自旋鎖獲得了鎖則自旋鎖所在線
程不必由用戶態陷入內核態,也不必交出自己的時間片進入等待狀態(見操作系統原理)。從而大大減少的獲取鎖的時間

有沒有比自旋鎖開銷更小的鎖機制呢?答案是有,下面就是一個利用X86 Interlock系列指令實現的win32用戶態鎖:
class CLocker
{
private:
_declspec(align(4)) volatile long m_lThreadId;
volatile long m_lLockCount;
int            m_iCollision;

public:
CLocker()
   :m_lThreadId(0)
   ,m_lLockCount(0)
   ,m_iCollision(0)
{}

~CLocker()
{
   if (m_lLockCount > 0)
    __debugbreak();
}

void Lock()
{
   const long tId = ::GetCurrentThreadId();
   if (tId == m_lThreadId)
   {
    ++m_lLockCount;
   }
   else
   {
    int iCol = 0;
    while (true)
    {
     ++iCol;
     if (_InterlockedCompareExchange(&m_lThreadId, tId, 0) == 0)
     {
      m_lLockCount = 1;
      if (iCol > m_iCollision)
       m_iCollision = iCol;
      return;
     }

     //volatile int delay;
     //const int maxDelay = (int)((rand() / (float)RAND_MAX) * 100) * 50;
     Sleep(0); //for (delay = 0; delay < maxDelay; ++delay); //
1
   }
}

void Release()
{
   const long tId = ::GetCurrentThreadId();
   if (tId == m_lThreadId)
   {
    if (--m_lLockCount == 0)
    {
     //_InterlockedExchange(&m_lThreadId, 0);
     m_lThreadId = 0;   //
這里不用Interlock操作,機器字對齊時寫入為原子操作
   }
}

int GetCollision()
{
   return m_iCollision;
}
};

該類通過Interlock系列指令集所具有的原子操作特性互斥的將臨界區資源交給獲得鎖的線程。所有操作均在用戶態執行,邏輯簡單,最終編譯結果指令數也非常少。極大提高了加鎖效率。注1處的循環是一個關鍵點。_InterlockedCompareExchange操作如果失敗會導致CPU執行復雜的Cache操作,從而浪費大量時間。使CAS失敗的線程等待,減少多線程爭用同一鎖時產生過多的_InterlockedCompareExchange操作失敗,從而提高加鎖效率。以下是測試結果

static CLocker GLocker;
......
//
線程核心函數,共兩個線程
for (int i = 0; i < 100000000; ++i)
{
GLocker.Lock();
++GlobalSum;
GLocker.Release();
}
......

測試結果為5.969s,可見用戶態鎖確實具有相對較高的效率。

需要說明的是,我的本意只是為了探討不同種類鎖的效率,實際情況中,多線程編程要盡量減少多線程間的資源爭用,從設計上避免頻繁加鎖解鎖(Lock-Free算法)

補充說明,windows平臺和xbox360平臺上的CriticalSection實際上包含一個內存屏障,保證臨界區前后的讀寫操作不會越界執行(見編譯器對指令的優化和CPU的指令亂序執行),一個InterlockedXxx操作,嵌套檢查,滿足特定條件向Mutex操作退化。CriticalSection使用合適的自旋次數能提高效率。CLocker由于沒有內存屏障實際上在某些情況下會不如CriticalSection安全,使用CLocker一定需要程序員自己保證內存操作的順序性。

實際上臨界區爭用導致線程等待的時間往往大于鎖執行的時間,優化加鎖解鎖速度實際上并未解決根本問題。

posted on 2011-05-14 02:03 肥仔 閱讀(8137) 評論(1)  編輯 收藏 引用 所屬分類: Windows開發

評論

# re: 幾種線程鎖的效率比較(多線程,鎖,CRITICAL_SECTION)  回復  更多評論   

I greatly appreciate your thoughts. For me these are significant things. Anyhow appreciate it. Good look over.
2011-05-14 14:52 | parker pen
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            一区二区三区久久网| 影音国产精品| 国产精品有限公司| 久久在线免费| 欧美在线视频网站| 久久riav二区三区| 久久午夜精品| 美女视频网站黄色亚洲| 欧美成人综合在线| 亚洲精品久久| 欧美激情中文字幕一区二区| 免费不卡在线视频| 亚洲国产一区二区三区a毛片| 欧美高清在线观看| 欧美韩日精品| 欧美呦呦网站| 在线观看成人av电影| 在线播放中文一区| 亚洲精品视频免费观看| 亚洲欧美日韩视频一区| 久久精品30| 欧美激情在线狂野欧美精品| 最近中文字幕日韩精品| 日韩午夜在线| 久久精品视频在线播放| 欧美成人免费视频| 国产精品一区二区a| 在线观看视频一区| 亚洲一区二区三区四区中文| 欧美日韩伦理在线| 国产一区二区精品久久99| 亚洲精品在线视频观看| 久久精品国产成人| 99香蕉国产精品偷在线观看| 欧美一区在线看| 欧美精品三区| 一区二区三区中文在线观看 | 亚洲三级观看| 午夜亚洲福利在线老司机| 美女爽到呻吟久久久久| 国产精品xvideos88| 在线成人亚洲| 欧美在线综合视频| 欧美激情国产日韩精品一区18| 中文成人激情娱乐网| 久久亚洲精选| 国产一区二区三区电影在线观看| 亚洲精品在线观看免费| 久久美女性网| 亚洲激情六月丁香| 亚洲国产高清在线观看视频| 久久人人97超碰精品888| 国产精品久久久久久久久久免费| 欧美中文字幕在线视频| 欧美日本高清一区| 99视频精品全部免费在线| 亚洲永久精品国产| 免费成人性网站| 午夜精品免费在线| 欧美三级午夜理伦三级中视频| 国产亚洲精品aa午夜观看| 亚洲午夜av在线| 欧美电影免费| 国产亚洲女人久久久久毛片| 亚洲精品一区二区三区樱花| 久久久久国产精品一区三寸| 亚洲永久免费精品| 国产精品无码永久免费888| 日韩一二三在线视频播| 欧美夫妇交换俱乐部在线观看| 亚洲欧美高清| 国产日韩欧美日韩大片| 亚洲免费视频一区二区| 亚洲精品日韩综合观看成人91| 免费短视频成人日韩| 亚洲国产天堂网精品网站| 嫩草国产精品入口| 羞羞漫画18久久大片| 91久久精品日日躁夜夜躁欧美 | 欧美日韩国产综合在线| 亚洲欧洲日韩在线| 亚洲国产婷婷香蕉久久久久久99| 欧美大片免费久久精品三p| 亚洲韩国青草视频| 亚洲人成网站影音先锋播放| 欧美色图五月天| 欧美一区二区啪啪| 久久精品国产综合精品| 亚洲国产精品国自产拍av秋霞| 欧美成人69av| 欧美精品日韩三级| 香蕉尹人综合在线观看| 欧美一区二区视频在线观看2020| 免费日韩一区二区| 亚洲精品视频在线看| 欧美吻胸吃奶大尺度电影| 欧美一级电影久久| 久久久久久成人| 99精品热视频| 亚洲一区二区在| 极品少妇一区二区三区| 亚洲日本黄色| 国产色综合天天综合网| 亚洲大胆美女视频| 欧美亚男人的天堂| 免费看精品久久片| 国产精品欧美日韩| 欧美电影在线观看完整版| 欧美日韩视频在线第一区| 久久国产婷婷国产香蕉| 欧美国产免费| 欧美一区亚洲二区| 欧美成年人视频| 久久久久久欧美| 国产精品国产三级国产aⅴ入口 | 欧美v日韩v国产v| 欧美天堂在线观看| 欧美国产在线电影| 国产女同一区二区| 亚洲美女中出| 亚洲精品1区2区| 久久av一区二区三区漫画| 一区二区精品国产| 欧美伊人久久| 欧美一激情一区二区三区| 香蕉av福利精品导航| 亚洲午夜一区二区三区| 欧美高清自拍一区| 老司机一区二区| 最近中文字幕日韩精品 | 午夜精品影院| 亚洲小说欧美另类婷婷| 欧美激情一二三区| 亚洲第一搞黄网站| 精品成人久久| 久久xxxx| 母乳一区在线观看| 在线不卡a资源高清| 欧美一区中文字幕| 久久久久国内| 黄色亚洲大片免费在线观看| 国产精品综合不卡av| 亚洲欧洲在线看| 黄色日韩在线| 亚洲尤物在线视频观看| 国产女主播一区二区| 亚洲人被黑人高潮完整版| 国内精品国语自产拍在线观看| 一区二区激情视频| 亚洲精品日韩精品| 久久婷婷麻豆| 久久久久**毛片大全| 国产精品久久久久影院色老大 | 亚洲精品视频在线播放| 午夜国产一区| 久久久一二三| 久久久精品日韩| 国产精品香蕉在线观看| 亚洲制服av| 久久综合九色综合久99| 在线欧美日韩国产| 欧美电影打屁股sp| 中日韩美女免费视频网址在线观看 | 毛片基地黄久久久久久天堂| 亚洲精品乱码久久久久久久久 | 亚洲人被黑人高潮完整版| 欧美成人tv| 99re66热这里只有精品4| 午夜精品久久久久久久久久久| aa成人免费视频| 久久九九免费视频| 亚洲日本精品国产第一区| 欧美日韩一区二区三区在线观看免| 亚洲图片你懂的| 欧美成人官网二区| 亚洲综合另类| 精品91在线| 国产精品久久久久久妇女6080 | 欧美亚洲视频在线观看| 在线观看免费视频综合| 欧美精品在线观看播放| 在线亚洲电影| 老司机午夜精品| 亚洲免费观看高清在线观看| 国产精品专区一| 欧美极品在线观看| 午夜精品久久久久久99热软件| 亚洲第一页在线| 欧美一区永久视频免费观看| 亚洲伦伦在线| 国语自产在线不卡| 国产精品第一区| 欧美精品福利在线| 久久婷婷亚洲| 欧美一级艳片视频免费观看| 999亚洲国产精| 亚洲风情在线资源站| 另类欧美日韩国产在线| 午夜亚洲一区| 亚洲一区二区精品在线|