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

woaidongmao

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

臨界區的LockCount為何小于-1

某日,在浙大國家實驗室,與老方和小崔調試監控死鎖問題。機柜里一溜架裝服務器上出現死鎖問題。用WinDbg看,發現其中導致死鎖的臨界區LockCount值是小于-1的數!!

 

多次重現該問題,發現LockCount經常是負的兩三百。

我等本著不十分科學嚴謹,但又有一點科學嚴謹的態度,裝模作樣查了下資料,顯示如下:

 

LockCount代表什么含義

 

ms-help://MS.MSDNQTR.v80.en/MS.MSDN.v80/dnmag03/html/CriticalSections1203default.htm

http://msdn.microsoft.com/zh-cn/magazine/cc164040(en-us).aspx

 

struct RTL_CRITICAL_SECTION

{

    PRTL_CRITICAL_SECTION_DEBUG DebugInfo;

    LONG LockCount;

    LONG RecursionCount;

    HANDLE OwningThread;

    HANDLE LockSemaphore;

    ULONG_PTR SpinCount;

};

 

LockCount

這是臨界區里最重要的字段。其初始值為-1,而0或更大的值表示臨界區被持有。當該值不等于-1OwningThread字段(該字段在WinNT.h里定義錯誤的,應該用DWORD而不是HANDLE類型)存放了持有該臨界區的線程ID

LockCount - (RecursionCount - 1 ) 表示還有多少其他線程在等待獲取該臨界區。

 

(以下是英文原版)

LockCount

This is the most important field in a critical section. It is initialized to a value of -1; a value of 0 or greater indicates that the critical section is held or owned. When it's not equal to -1, the OwningThread field (this field is incorrectly defined in WINNT.H—it should be a DWORD instead of a HANDLE) contains the thread ID that owns this critical section. The delta between this field and the value of (RecursionCount -1) indicates how many additional threads are waiting to acquire the critical section.

 

 

LockCount的值是如何變化的。

 

網上有很多文章根據臨界區的原理,總結了兩個能使LockCount變換的函數的偽代碼如下:

 

_RtlTryEnterCriticalSection

 

if(CriticalSection->LockCount == -1)

{

  // 臨界區可用

  CriticalSection->LockCount = 0;

  CriticalSection->OwningThread = TEB->ClientID;

  CriticalSection->RecursionCount = 1;

 

  return TRUE;

}

else

{

  if(CriticalSection->OwningThread == TEB->ClientID)

  {

    // 臨界區是當前線程獲取

    CriticalSection->LockCount++;

    CriticalSection->RecursionCount++;

 

    return TRUE;

  }

  else

  {

    // 臨界區已被其它線程獲取

    return FALSE;

  }

}

 

 

_RtlLeaveCriticalSection

 

if(--CriticalSection->RecursionCount == 0)

{

  // 臨界區已不再被使用

  CriticalSection->OwningThread = 0;

 

  if(--CriticalSection->LockCount)

  {

    // 仍有線程鎖定在臨界區上

    _RtlpUnWaitCriticalSection(CriticalSection)

  }

}

else

{

  --CriticalSection->LockCount

}

 

上述文字中的含義可以比較清晰地推斷出:

1.       RecursionCount有可能由于LeaveCriticalSection的多余調用而小于初值0 (已經實證)

2.       LockCount的值只可能大于或等于初值-1

 

理論似乎再一次與事實不符!

 

我們開始胡思亂想,猜測如下幾種可能:

1.       EnterCriticalSection執行到一半異常中止

這種機會很小,即使發生,也找不出什么道理讓LockCount變成負兩三百這么離譜。

2.       內存錯亂導致RTL_CRITICAL_SECTION結構被寫壞。

 

但幾種推測都查證無果。

 

一個偶然的機會 -_-!!! ,我在自己的計算機上實驗的時候,居然也發現了LockCount小于-1!而且屢試不爽!

我的計算機裝的Windows Vista,我們自然就有如下猜想:

在某個操作系統版本下,LockCount的機制本來就有所不同!!

 

這個猜想比較靠譜,立刻著手驗證。實驗室里發生這個問題的電腦都是Windows2003+SP1。我們馬上在Windows2003+SP1系統做了測試,寫了個非常簡單的測試,創建一個臨界區,然后調用EnterCriticalSection,果然發現LockCount編程了-2!而多線程下測試,也確實會出現負兩三百的情況。

看來LockCount的含義在不同版本的Win下確實不一樣。

其后我們多次嘗試上網搜索關于LockCount含義在Windows不同版本中的變遷,卻不得要領。

又一個偶然的機會 -_-!!! ,老方在WinDbg的幫助文檔里發現了一段關于LockCount變遷的說明,全文如下(真是踏破鐵鞋無覓處,得來全不費工夫)

 

 

Interpreting Critical Section Fields in Windows Server 2003 SP1 and Later

 

In Microsoft Windows Server 2003 Service Pack 1 and later versions of Windows, the LockCount field is parsed as follows:

 

The lowest bit shows the lock status. If this bit is 0, the critical section is locked; if it is 1, the critical section is not locked.

The next bit shows whether a thread has been woken for this lock. If this bit is 0, then a thread has been woken for this lock; if it is 1, no thread has been woken.

The remaining bits are the ones-complement of the number of threads waiting for the lock.

 

As an example, suppose the LockCount is -22. The lowest bit can be determined in this way:

 

0:009> ? 0x1 & (-0n22)

uate expression: 0 = 00000000

 

The next-lowest bit can be determined in this way:

 

0:009> ? (0x2 & (-0n22)) >> 1

uate expression: 1 = 00000001

 

The ones-complement of the remaining bits can be determined in this way:

 

0:009> ? ((-1) - (-0n22)) >> 2

uate expression: 5 = 00000005

 

In this example, the first bit is 0 and therefore the critical section is locked. The second bit is 1, and so no thread has been woken for this lock. The complement of the remaining bits is 5, and so there are five threads waiting for this lock.

 

 

事情至此總算水落石出!

 

posted on 2011-01-13 17:50 肥仔 閱讀(2089) 評論(0)  編輯 收藏 引用 所屬分類: Windows開發

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            日韩性生活视频| 另类图片国产| 久久综合精品一区| 久久精品2019中文字幕| 久久黄色影院| 老司机免费视频久久| 男男成人高潮片免费网站| 麻豆freexxxx性91精品| 亚洲福利视频一区| 久久亚洲欧美| 亚洲国产欧美在线人成| 日韩一二三区视频| 亚洲图片欧洲图片日韩av| 午夜视频在线观看一区二区三区| 篠田优中文在线播放第一区| 狼狼综合久久久久综合网| 欧美成人国产va精品日本一级| 欧美日韩高清在线| 国产亚洲欧美日韩在线一区| 亚洲激情网址| 亚洲欧美日韩国产| 欧美a级理论片| 亚洲亚洲精品在线观看| 久久久人成影片一区二区三区| 欧美精品在线观看91| 国产一区二区三区在线观看网站| 亚洲精品免费在线播放| 久久疯狂做爰流白浆xx| 亚洲精品免费在线观看| 久久精品国产亚洲高清剧情介绍| 欧美精品国产精品日韩精品| 国产综合色精品一区二区三区| 亚洲久久一区二区| 久久一区二区三区超碰国产精品 | 日韩午夜av| 日韩网站免费观看| 欧美一区二区三区视频免费播放| 欧美一级久久| 欧美一区二区三区在线播放| 亚洲黑丝一区二区| 欧美亚洲免费| 欧美午夜激情视频| 亚洲日本理论电影| 免费在线成人av| 欧美一区激情视频在线观看| 国产精品久久久久秋霞鲁丝| 中文国产亚洲喷潮| 亚洲区在线播放| 欧美jizz19hd性欧美| 在线 亚洲欧美在线综合一区| 欧美在线播放一区| 亚洲女性喷水在线观看一区| 欧美日韩国产精品自在自线| 亚洲国产精品一区在线观看不卡| 久久久夜精品| 欧美在线91| 国内精品国产成人| 久久久综合网| 久久久久久久91| 尤物yw午夜国产精品视频明星| 久久久久免费视频| 久久国内精品自在自线400部| 国产无遮挡一区二区三区毛片日本| 香蕉免费一区二区三区在线观看 | 亚洲小少妇裸体bbw| 亚洲高清视频在线观看| 免费高清在线视频一区·| 在线观看欧美日韩| 亚洲第一天堂av| 欧美日韩国产在线一区| 亚洲宅男天堂在线观看无病毒| 国产精品99久久久久久久vr| 欧美午夜片欧美片在线观看| 性欧美精品高清| 久久久成人精品| 91久久精品美女| 亚洲精品影视| 国产精品中文字幕欧美| 麻豆精品一区二区综合av| 美女视频黄a大片欧美| 日韩午夜免费视频| 亚洲一区二区三区四区在线观看| 国产视频自拍一区| 欧美高清不卡| 国产精品家庭影院| 久久婷婷久久| 欧美精品一区二| 欧美一区二区三区久久精品茉莉花 | 久久精品欧洲| 久久精品亚洲一区二区| 亚洲人成在线播放网站岛国| 在线亚洲一区观看| 国模精品一区二区三区色天香| 欧美大片在线看免费观看| 欧美视频官网| 欧美**人妖| 国产精品午夜在线| 欧美国产精品人人做人人爱| 国产精品国产三级国产普通话三级| 久久精品国产亚洲一区二区| 欧美激情黄色片| 久久久精品免费视频| 欧美日产一区二区三区在线观看| 久久久91精品国产一区二区三区 | 午夜精品福利一区二区三区av| 亚洲国产黄色| 性欧美1819sex性高清| 一本到高清视频免费精品| 久久国产精品亚洲va麻豆| 亚洲一区激情| 欧美激情中文字幕乱码免费| 久久只有精品| 国产视频在线观看一区二区| 一本久久综合亚洲鲁鲁五月天| 精久久久久久| 午夜精品久久久久久久99水蜜桃 | 亚洲精品护士| 久久精品综合一区| 性色一区二区| 欧美日韩四区| 亚洲欧洲在线观看| 91久久在线| 久久婷婷蜜乳一本欲蜜臀| 久久精品视频一| 国产麻豆午夜三级精品| 宅男噜噜噜66一区二区| 一区二区三区免费网站| 欧美国产一区二区在线观看 | 亚洲一区高清| 亚洲自拍偷拍色片视频| 欧美理论电影在线播放| 欧美激情一区二区久久久| 在线观看国产成人av片| 久久精品五月| 欧美成人午夜77777| 伊人夜夜躁av伊人久久| 久久成人18免费网站| 久久综合99re88久久爱| 影音先锋亚洲视频| 久久久女女女女999久久| 久久综合亚州| 国产情人节一区| 国产一区二区丝袜高跟鞋图片 | 久久激情综合网| 久久精品1区| 好吊妞这里只有精品| 欧美专区第一页| 久久人体大胆视频| 18成人免费观看视频| 女女同性精品视频| 亚洲黄色在线视频| 一区二区欧美日韩| 国产精品久久国产精品99gif| 亚洲永久免费| 美女精品国产| 一区二区三区.www| 国产日韩一区二区三区在线| 久久er99精品| 亚洲国产成人精品视频| 亚洲无线观看| 黄色日韩网站| 欧美三区免费完整视频在线观看| 亚洲欧洲av一区二区| 欧美国产精品v| 午夜在线视频观看日韩17c| 在线播放日韩欧美| 欧美日韩亚洲一区二区三区在线观看 | 国产精品一级在线| 久久国产欧美日韩精品| 欧美激情精品久久久| 中文亚洲视频在线| 国产亚洲欧美中文| 欧美激情精品久久久久久蜜臀 | 欧美在线免费| 亚洲日韩欧美视频| 国产精品一区免费视频| 久久免费国产精品| 一区二区三区高清不卡| 久久综合五月| 欧美一级视频免费在线观看| 亚洲人久久久| 国内久久精品| 国产精品久久久久久影视| 免费在线视频一区| 欧美诱惑福利视频| 一区二区三区欧美亚洲| 欧美激情中文字幕一区二区| 欧美在线欧美在线| 99re8这里有精品热视频免费 | 亚洲欧美清纯在线制服| 亚洲国产欧美另类丝袜| 国产免费观看久久黄| 欧美人与性动交a欧美精品| 久久精品女人| 亚洲欧美在线另类| 一区二区三区久久| 亚洲精品一二三区| 亚洲国产91| 欧美好吊妞视频| 美女任你摸久久|