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

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 肥仔 閱讀(8123) 評論(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>
            欧美精品激情在线观看| 农村妇女精品| 国产欧美日韩精品在线| 欧美黄网免费在线观看| 欧美日本国产| 欧美日韩高清在线| 国产精品国产亚洲精品看不卡15| 欧美三级视频在线观看| 国产欧美日韩另类一区| 狠狠色狠狠色综合| 亚洲国产精品免费| 另类成人小视频在线| 久久婷婷丁香| 欧美华人在线视频| 国产精品毛片大码女人| 激情综合五月天| 在线视频欧美精品| 欧美亚洲一级| 欧美国产一区视频在线观看| 夜久久久久久| 久久狠狠久久综合桃花| 欧美jizzhd精品欧美喷水| 国产精品区一区| 亚洲观看高清完整版在线观看| 日韩视频免费看| 欧美怡红院视频| 亚洲福利视频网| 亚洲手机成人高清视频| 久久久www成人免费精品| 欧美激情一区二区三区在线| 国产日韩欧美黄色| 亚洲精品护士| 久久精品系列| 一区二区三区免费在线观看| 久久九九热免费视频| 欧美三级电影一区| 亚洲激情视频在线| 久久久久久**毛片大全| 一区二区三区三区在线| 欧美不卡视频一区发布| 国产日韩欧美综合精品| 一级日韩一区在线观看| 欧美α欧美αv大片| 欧美一区日韩一区| 国产精品久久久久久久9999| 亚洲欧美日韩在线观看a三区 | 亚洲制服av| 欧美二区在线| 久久成人一区二区| 国产精品入口夜色视频大尺度 | 欧美日韩精品是欧美日韩精品| 国内精品一区二区三区| 西瓜成人精品人成网站| 一本一本久久a久久精品综合麻豆| 免费国产一区二区| 亚洲国产精品久久久久秋霞蜜臀| 久久久久综合一区二区三区| 亚洲欧美日韩一区在线观看| 国产精品视频yy9299一区| 亚洲欧美精品| 亚洲综合精品四区| 国产九九精品视频| 亚洲欧美清纯在线制服| 日韩一区二区高清| 欧美日韩在线电影| 亚洲欧美国产日韩天堂区| 亚洲欧美中文另类| 一本久道久久综合中文字幕 | 亚洲午夜久久久| 国产精品激情| 欧美夜福利tv在线| 亚洲欧美日韩精品久久久久| 国产欧美一区二区精品忘忧草| 亚洲欧美制服中文字幕| 亚洲一区二区在线播放| 国产精品亚洲一区| 久久久夜夜夜| 欧美大片一区| 亚洲男女自偷自拍| 久久av最新网址| 亚洲激情欧美| 欧美成人综合网站| 欧美色视频在线| 久久久久久久高潮| 久久久久久久久伊人| 亚洲精选视频在线| 亚洲影院一区| 91久久精品国产91性色| 亚洲美女网站| 午夜激情一区| 亚洲高清一区二| 一区二区三区|亚洲午夜| 亚洲国内自拍| 欧美日韩一区二区国产| 久久久久久亚洲精品中文字幕| 久久亚洲一区二区| 亚洲私人影院| 久久久久久久91| 中文在线不卡视频| 久久免费少妇高潮久久精品99| 亚洲伦理在线| 欧美一激情一区二区三区| 亚洲精品欧美日韩专区| 欧美永久精品| 中文精品在线| 蜜桃久久精品一区二区| 羞羞视频在线观看欧美| 欧美日韩国产一级| 欧美激情按摩| 伊人成年综合电影网| 亚洲自拍偷拍色片视频| 日韩一级网站| 免费看av成人| 裸体素人女欧美日韩| 国产免费亚洲高清| 亚洲视频免费观看| 99天天综合性| 欧美精品一区二| 最近中文字幕日韩精品| 亚洲国产精品久久| 久久综合久久综合久久| 久久综合网hezyo| 国内精品视频久久| 久久国产一区二区| 久久精品国产亚洲一区二区| 国产精品美女一区二区在线观看| 亚洲欧洲一区二区在线观看 | 免费一区视频| 狠狠色噜噜狠狠色综合久| 夜夜嗨一区二区| 日韩视频―中文字幕| 久久av免费一区| 久久av资源网站| 国产精品免费视频观看| 亚洲高清不卡在线观看| 亚洲国产视频一区| 亚洲欧美日韩人成在线播放| 午夜视频一区二区| 欧美久久视频| 亚洲理论在线观看| 99精品视频网| 亚洲社区在线观看| 国产精品入口日韩视频大尺度| 亚洲国产高清自拍| 99re热这里只有精品免费视频| 久久精品国产2020观看福利| 久久夜色精品国产亚洲aⅴ| 欧美日韩爆操| 99在线热播精品免费99热| 亚洲免费在线精品一区| 欧美精品一区在线播放| 99精品国产99久久久久久福利| 亚洲国产高清一区| 欧美激情一二三区| 在线视频精品一| 国产精品久久久久免费a∨| 99视频一区二区| 亚洲视频精品在线| 久久免费少妇高潮久久精品99| 久久精品主播| 国产一区二区主播在线| 欧美中文在线视频| 久久只有精品| 99热这里只有精品8| 欧美国产在线观看| 亚洲精品免费一区二区三区| 亚洲免费福利视频| 国产伦精品免费视频| 欧美一区二区三区日韩| 久久久久国产精品一区二区| 韩国av一区二区三区四区| 欧美激情视频网站| 一区二区三区日韩| 国产精品主播| 欧美在线精品一区| 亚洲精选大片| 久久久久免费观看| 亚洲另类在线视频| 国产一区美女| 免费成人小视频| 性欧美xxxx视频在线观看| 久久精品一二三| 亚洲国产精品久久久久秋霞蜜臀| 国产精品久久久久久久久久免费看 | 久久久久国色av免费看影院 | 日韩午夜av在线| 新67194成人永久网站| 亚洲激情在线播放| 国产精品高潮在线| 久久久最新网址| 久久亚洲综合| 国产精品日韩精品欧美精品| 久久在线精品| 亚洲精品在线免费| 99人久久精品视频最新地址| 在线免费不卡视频| 欧美日韩亚洲高清一区二区| 欧美中文在线观看| 久久综合国产精品台湾中文娱乐网| 亚洲影视在线播放|