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

woaidongmao

文章均收錄自他人博客,但不喜標(biāo)題前加-[轉(zhuǎn)貼],因其丑陋,見諒!~
隨筆 - 1469, 文章 - 0, 評(píng)論 - 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ù)?。?span lang="EN-US">

 

多次重現(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)該值不等于-1,OwningThread字段(該字段在WinNT.h里定義錯(cuò)誤的,應(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é)了兩個(gè)能使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ī)會(huì)很小,即使發(fā)生,也找不出什么道理讓LockCount變成負(fù)兩三百這么離譜。

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

 

但幾種推測都查證無果。

 

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

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

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

 

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

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

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

又一個(gè)偶然的機(jī)會(huì) -_-!!! ,老方在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 肥仔 閱讀(2081) 評(píng)論(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精品久久久久久| 性娇小13――14欧美| 国产主播在线一区| 欧美aⅴ99久久黑人专区| 欧美高清hd18日本| 亚洲视频欧美视频| 午夜精品区一区二区三| 精品成人一区二区三区| 亚洲高清123| 欧美性猛交99久久久久99按摩| 亚洲欧美日韩一区在线观看| 欧美一级久久| 亚洲精品乱码久久久久| 亚洲色图在线视频| 1000部精品久久久久久久久| 日韩视频不卡中文| 国产有码在线一区二区视频| 亚洲激情中文1区| 国产欧美日韩另类一区| 欧美黑人多人双交| 国产精品黄色| 亚洲成人直播| 国产日韩欧美三级| 亚洲人成网站777色婷婷| 国产亚洲毛片| 一区二区三区高清在线| 亚洲电影视频在线| 亚洲你懂的在线视频| 亚洲区中文字幕| 欧美在线观看一区二区三区| 一本色道久久综合精品竹菊| 久久riav二区三区| 午夜精品剧场| 欧美—级在线免费片| 久久婷婷影院| 国产人妖伪娘一区91| 亚洲理论在线观看| 亚洲人精品午夜| 久久电影一区| 午夜精品福利电影| 欧美日韩中文字幕| 欧美激情中文字幕乱码免费| 国产一区美女| 亚洲欧美精品suv| 亚洲一区影院| 欧美日韩国产在线播放| 亚洲国产第一页| 亚洲国产黄色片| 久久国产成人| 久久视频这里只有精品| 国产精品自拍网站| 亚洲综合色丁香婷婷六月图片| 亚洲视频免费在线观看| 欧美日本精品在线| 日韩亚洲视频| 这里只有精品视频| 欧美精品免费播放| 亚洲高清不卡在线观看| 91久久中文| 欧美激情中文不卡| 亚洲精品久久久久| 亚洲社区在线观看| 欧美午夜美女看片| 亚洲无线一线二线三线区别av| 亚洲色图自拍| 国产精品每日更新| 亚洲欧美日产图| 久久精品亚洲精品国产欧美kt∨| 国产女人水真多18毛片18精品视频| 亚洲图片欧洲图片av| 欧美尤物巨大精品爽| 国产午夜精品久久久| 久久九九精品99国产精品| 久久影院午夜论| 亚洲福利一区| 欧美日韩国产成人高清视频| 一区二区三区日韩欧美| 欧美一区二区三区成人| 精品成人a区在线观看| 欧美大片第1页| 一区二区三区偷拍| 久久久www成人免费无遮挡大片| 国产真实久久| 欧美第十八页| 亚洲一区三区视频在线观看| 久久综合婷婷| 在线亚洲欧美视频| 国产一区二区三区久久精品| 久久手机免费观看| 艳女tv在线观看国产一区| 久久久国产精品一区| 最新日韩欧美| 国产精品爽爽爽| 免费亚洲电影在线观看| 亚洲网站在线| 欧美激情亚洲激情| 午夜精品久久久久久99热软件| 精品99一区二区| 欧美视频三区在线播放| 久久人91精品久久久久久不卡| 亚洲精品日韩精品| 美女精品国产| 亚洲女人天堂成人av在线| 在线观看日韩www视频免费 | 久久久伊人欧美| 亚洲精品乱码久久久久久蜜桃91 | 在线日韩视频| 国产精品一区二区在线观看不卡| 久久国产手机看片| 亚洲深爱激情| 亚洲国产欧美久久| 久久久久久亚洲精品不卡4k岛国| 一本色道久久综合狠狠躁篇怎么玩 | 激情成人在线视频| 国产精品久久一区主播| 欧美成人免费网| 久久久久久久一区二区三区| 亚洲私拍自拍| 亚洲人在线视频| 欧美激情视频在线免费观看 欧美视频免费一 | 99国产精品视频免费观看一公开| 韩国亚洲精品| 国产日韩欧美日韩大片| 欧美性猛交xxxx乱大交退制版| 男人的天堂成人在线| 久久色在线观看| 久久久久久夜| 欧美在线一级va免费观看| 亚洲影院污污.| 中文精品视频一区二区在线观看| 亚洲国产综合视频在线观看| 蜜桃av一区二区在线观看| 久久久精品一品道一区| 香蕉免费一区二区三区在线观看| 亚洲婷婷综合色高清在线| 99精品福利视频| 一区二区三区www| 中文在线不卡视频| 亚洲手机视频| 午夜一区二区三区在线观看 | 亚洲国内自拍| 99re6热在线精品视频播放速度| 亚洲国产精品女人久久久| 在线免费观看日本一区| 在线欧美视频| 亚洲精品黄网在线观看| 99pao成人国产永久免费视频| 亚洲精品孕妇| 亚洲自拍都市欧美小说| 欧美一区二区三区在线视频| 久久久久久亚洲精品中文字幕| 久久久久久69| 欧美丰满高潮xxxx喷水动漫| 亚洲国产综合91精品麻豆| 一本色道久久88亚洲综合88| 一区二区三区日韩精品视频| 小黄鸭精品密入口导航| 久久久亚洲高清| 欧美久久在线| 国产日韩欧美夫妻视频在线观看| 黑人一区二区| 艳女tv在线观看国产一区| 午夜精彩国产免费不卡不顿大片| 久久九九精品| 亚洲电影免费| 中文亚洲欧美| 久热这里只精品99re8久| 欧美精品日韩www.p站| 国产精品丝袜91| 亚洲激情影视| 午夜精品久久久| 欧美福利一区| 亚洲已满18点击进入久久| 久久久精彩视频| 欧美无乱码久久久免费午夜一区| 国产亚洲综合在线| 日韩性生活视频| 久久久国产视频91| 日韩视频二区| 久久久久久9| 国产精品久久国产精麻豆99网站| 1000部精品久久久久久久久| 亚洲综合色激情五月| 美女主播精品视频一二三四| 亚洲视频成人| 欧美激情在线狂野欧美精品| 国产亚洲欧美色| 亚洲男女毛片无遮挡| 亚洲第一主播视频| 欧美在线日韩精品| 国产精品毛片大码女人| 亚洲精品免费一区二区三区| 欧美有码在线视频| 日韩一区二区精品| 欧美国产精品久久| 1204国产成人精品视频| 欧美在线看片a免费观看| 99国产精品国产精品久久|