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

woaidongmao

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

臨界區(qū)的LockCount為何小于-1

某日,在浙大國家實(shí)驗(yàn)室,與老方和小崔調(diào)試監(jiān)控死鎖問題。機(jī)柜里一溜架裝服務(wù)器上出現(xiàn)死鎖問題。用WinDbg看,發(fā)現(xiàn)其中導(dǎo)致死鎖的臨界區(qū)LockCount值是小于-1的數(shù)!!

 

多次重現(xiàn)該問題,發(fā)現(xiàn)LockCount經(jīng)常是負(fù)的兩三百。

我等本著不十分科學(xué)嚴(yán)謹(jǐn),但又有一點(diǎn)科學(xué)嚴(yán)謹(jǐn)?shù)膽B(tài)度,裝模作樣查了下資料,顯示如下:

 

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

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

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

 

(以下是英文原版)

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的值是如何變化的。

 

網(wǎng)上有很多文章根據(jù)臨界區(qū)的原理,總結(jié)了兩個能使LockCount變換的函數(shù)的偽代碼如下:

 

_RtlTryEnterCriticalSection

 

if(CriticalSection->LockCount == -1)

{

  // 臨界區(qū)可用

  CriticalSection->LockCount = 0;

  CriticalSection->OwningThread = TEB->ClientID;

  CriticalSection->RecursionCount = 1;

 

  return TRUE;

}

else

{

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

  {

    // 臨界區(qū)是當(dāng)前線程獲取

    CriticalSection->LockCount++;

    CriticalSection->RecursionCount++;

 

    return TRUE;

  }

  else

  {

    // 臨界區(qū)已被其它線程獲取

    return FALSE;

  }

}

 

 

_RtlLeaveCriticalSection

 

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

{

  // 臨界區(qū)已不再被使用

  CriticalSection->OwningThread = 0;

 

  if(--CriticalSection->LockCount)

  {

    // 仍有線程鎖定在臨界區(qū)上

    _RtlpUnWaitCriticalSection(CriticalSection)

  }

}

else

{

  --CriticalSection->LockCount

}

 

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

1.       RecursionCount有可能由于LeaveCriticalSection的多余調(diào)用而小于初值0 (已經(jīng)實(shí)證)

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

 

理論似乎再一次與事實(shí)不符!

 

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

1.       EnterCriticalSection執(zhí)行到一半異常中止

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

2.       內(nèi)存錯亂導(dǎo)致RTL_CRITICAL_SECTION結(jié)構(gòu)被寫壞。

 

但幾種推測都查證無果。

 

一個偶然的機(jī)會 -_-!!! ,我在自己的計算機(jī)上實(shí)驗(yàn)的時候,居然也發(fā)現(xiàn)了LockCount小于-1!而且屢試不爽!

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

在某個操作系統(tǒng)版本下,LockCount的機(jī)制本來就有所不同!!

 

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

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

其后我們多次嘗試上網(wǎng)搜索關(guān)于LockCount含義在Windows不同版本中的變遷,卻不得要領(lǐng)。

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

 

 

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

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            欧美国产另类| 亚洲区国产区| 久久露脸国产精品| 亚洲第一网站| 一本色道久久99精品综合| 欧美日韩国产三区| 亚洲综合视频1区| 久久综合狠狠| 99国产一区| 国产精品一区毛片| 久久精品在线免费观看| 亚洲国产成人av好男人在线观看| 日韩一级黄色av| 国产女主播一区二区| 久久综合五月| 一区二区三区四区蜜桃| 久久人体大胆视频| 亚洲美女一区| 国产日韩在线播放| 欧美激情在线| 久久成人精品无人区| 亚洲国产精品一区制服丝袜| 亚洲欧美日韩久久精品 | 欧美午夜电影完整版| 欧美在线免费播放| 亚洲欧洲一区二区三区| 久久精品在线| 亚洲小视频在线观看| 在线观看国产精品网站| 国产精品久久久久国产精品日日| 久久九九国产精品怡红院| 99精品国产一区二区青青牛奶| 久久精品亚洲精品国产欧美kt∨| 亚洲精品字幕| 伊人一区二区三区久久精品| 欧美午夜视频| 欧美国产激情| 久久久久久亚洲精品中文字幕 | 亚洲人成在线观看网站高清| 久久久久久噜噜噜久久久精品| 99热精品在线| 亚洲高清在线视频| 国产日韩欧美日韩大片| 欧美日韩一区三区四区| 毛片一区二区三区| 久久精品噜噜噜成人av农村| 亚洲一级片在线观看| 91久久久在线| 欧美成人精品在线播放| 久久精品伊人| 羞羞视频在线观看欧美| 中日韩视频在线观看| 亚洲剧情一区二区| 亚洲电影第1页| 国产一区二区三区在线观看免费| 国产精品成人免费| 欧美日韩网址| 欧美精品亚洲精品| 欧美精品午夜视频| 欧美国产大片| 欧美高清视频| 欧美国产在线电影| 欧美激情一区二区三区在线视频| 麻豆久久婷婷| 欧美福利视频一区| 欧美大片一区| 欧美福利小视频| 免费久久99精品国产| 久久久国产一区二区三区| 久久精品国产久精国产一老狼| 欧美亚洲一区三区| 久久激情综合| 久久一区二区三区国产精品| 麻豆成人小视频| 欧美wwwwww| 欧美精品一区二区三区在线看午夜 | 国产精品久久久久天堂| 国产精品豆花视频| 国产精品一区二区三区免费观看| 国产精品久久久久三级| 国产日韩欧美亚洲一区| 国产视频在线一区二区| 狠狠色噜噜狠狠色综合久 | 91久久精品国产| 亚洲免费成人av电影| 99香蕉国产精品偷在线观看| 亚洲小视频在线观看| 午夜免费久久久久| 久久久久久97三级| 欧美高清免费| 欧美午夜宅男影院| 国产视频一区在线观看| 伊人蜜桃色噜噜激情综合| 亚洲激情影院| 亚洲小说春色综合另类电影| 欧美专区18| 欧美成人综合在线| 一本色道久久加勒比88综合| 亚洲一区观看| 久久婷婷成人综合色| 欧美日韩高清区| 国产美女精品| 91久久精品美女高潮| 亚洲午夜精品久久久久久app| 久久成人精品无人区| 欧美肥婆在线| 一区二区欧美亚洲| 久久精品国产免费| 欧美人成在线| 韩国av一区二区| 亚洲视频在线观看免费| 久久久久综合| 日韩视频二区| 久久一区二区精品| 国产精品高潮久久| 亚洲激情网址| 久久福利精品| 99在线热播精品免费| 久久久久五月天| 国产精品xxxxx| 亚洲国产视频a| 久久精品国产一区二区三区| 亚洲国产精品一区| 欧美在线免费观看| 国产精品国产三级国产aⅴ9色| 一色屋精品视频免费看| 欧美一级网站| 亚洲卡通欧美制服中文| 另类专区欧美制服同性| 国产一区二区三区不卡在线观看| aa级大片欧美三级| 欧美不卡激情三级在线观看| 亚洲欧美国产精品桃花| 欧美日韩国产综合视频在线观看中文 | 亚洲精品国产拍免费91在线| 久久久久国产精品麻豆ai换脸| 国产精品国产三级国产a| 亚洲精品久久久久久久久久久| 久久精品一区二区三区不卡牛牛| 99国产一区二区三精品乱码| 欧美成人四级电影| 在线免费观看欧美| 久久久久一区二区三区| 午夜日韩在线| 国产精品一级| 亚洲一区二区在线| 99国产精品久久久久久久| 欧美国产日韩在线| 91久久久一线二线三线品牌| 欧美日韩无遮挡| 亚洲日本无吗高清不卡| 欧美成人精品在线观看| 久久久久久亚洲综合影院红桃| 国产亚洲欧洲| 久久精品中文| 久久gogo国模啪啪人体图| 国产伪娘ts一区| 久久超碰97中文字幕| 亚洲欧美日韩综合aⅴ视频| 国产精品蜜臀在线观看| 欧美精品色一区二区三区| 亚洲国产一区二区三区高清| 欧美福利在线| 欧美电影资源| 99热在线精品观看| 亚洲乱码国产乱码精品精天堂 | 黄色精品一区| 美国十次成人| 蜜桃av综合| 9l国产精品久久久久麻豆| 亚洲精品在线观| 国产精品电影在线观看| 性色一区二区三区| 性刺激综合网| 国产日韩一区二区三区| 久久午夜精品一区二区| 久久色在线播放| 亚洲美洲欧洲综合国产一区| 亚洲精选视频免费看| 国产精品盗摄一区二区三区| 午夜日本精品| 久久免费精品日本久久中文字幕| 亚洲国产天堂久久国产91| 亚洲欧洲日本在线| 欧美视频在线观看免费| 久久精品视频免费| 麻豆精品在线视频| 亚洲午夜激情| 欧美在线www| 亚洲精品在线免费| 亚洲性图久久| 亚洲承认在线| 一本大道久久精品懂色aⅴ| 国产欧美日韩中文字幕在线| 老司机精品福利视频| 欧美日韩国产美女| 久久在线视频| 欧美日韩一级黄| 狂野欧美性猛交xxxx巴西| 欧美精品一区二区三|