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

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>
            在线 亚洲欧美在线综合一区| 久久精品一区二区三区不卡牛牛| 亚洲一区二区免费在线| 在线免费观看一区二区三区| 亚洲成色777777在线观看影院| 一区二区三区在线不卡| 亚洲黄色在线视频| 亚洲精品综合| 一本一本a久久| 亚洲欧美日韩网| 另类亚洲自拍| 亚洲免费高清| 欧美一级片一区| 久久亚洲美女| 欧美视频日韩| 在线播放国产一区中文字幕剧情欧美 | 毛片一区二区三区| 亚洲高清在线精品| 亚洲日本电影| 午夜视频久久久| 欧美3dxxxxhd| 国产精品综合av一区二区国产馆| 1000部精品久久久久久久久| 亚洲免费视频在线观看| 欧美**字幕| 亚洲永久免费视频| 欧美高清视频一区二区三区在线观看| 国产精品久久久久免费a∨大胸| 在线不卡视频| 性欧美暴力猛交69hd| 亚洲片在线资源| 欧美一区二区三区四区视频| 欧美精品电影在线| 精品成人在线观看| 欧美一区二区三区四区在线观看 | 欧美成人免费小视频| 国产欧美日韩三区| 在线亚洲激情| 欧美激情第五页| 午夜精品av| 欧美午夜激情在线| 久久久久成人精品免费播放动漫| 欧美日韩精品| 亚洲国产日韩欧美综合久久| 久久精品国产综合| 亚洲视频一区| 欧美亚日韩国产aⅴ精品中极品| 亚洲日产国产精品| 欧美v日韩v国产v| 欧美中在线观看| 国产日韩一区二区| 欧美伊人久久久久久午夜久久久久| 99re66热这里只有精品4| 欧美精品免费看| 一本色道久久加勒比88综合| 最近中文字幕日韩精品 | 欧美bbbxxxxx| 亚洲韩日在线| 欧美激情一区二区三区全黄| 久久综合国产精品台湾中文娱乐网| 国产日韩精品一区二区| 亚洲在线视频网站| 一本高清dvd不卡在线观看| 欧美剧在线免费观看网站| 日韩视频免费观看高清完整版| 亚洲国产精品成人综合色在线婷婷| 免费看av成人| 一本久久综合| 一区二区三区四区五区精品| 国产精品区一区二区三| 久久国产夜色精品鲁鲁99| 久久av一区二区三区| 亚洲成人资源网| 亚洲人成亚洲人成在线观看| 欧美婷婷久久| 久久精品国产69国产精品亚洲| 欧美一区二区日韩| 伊大人香蕉综合8在线视| 欧美大胆a视频| 欧美绝品在线观看成人午夜影视| 亚洲午夜高清视频| 欧美亚洲免费| 亚洲精品久久久久久久久久久| 亚洲精选久久| 国产一级精品aaaaa看| 欧美国产91| 国产精品久久久久久久久久三级| 久久精品中文| 欧美日本二区| 久久久久99精品国产片| 女仆av观看一区| 亚洲欧美一区二区原创| 久久亚洲不卡| 西西人体一区二区| 欧美.www| 久久精品一区| 欧美日韩亚洲激情| 久久久一本精品99久久精品66| 欧美福利一区二区三区| 国产日韩欧美成人| 欧美激情一区二区三区不卡| 国产精品一区在线观看你懂的| 蜜臀a∨国产成人精品| 国产精品第一页第二页第三页| 麻豆九一精品爱看视频在线观看免费| 欧美日韩大片| 免费成年人欧美视频| 国产精品裸体一区二区三区| 欧美国产日韩亚洲一区| 国产视频一区在线| 日韩亚洲成人av在线| 亚洲国产精品999| 午夜精品亚洲一区二区三区嫩草| 亚洲精品影院| 久久综合色综合88| 久久精品三级| 国产精品久久久久婷婷| 亚洲精品视频在线观看免费| 亚洲国内自拍| 久久中文欧美| 久久综合亚州| 国内外成人免费激情在线视频网站 | 亚洲精品国产视频| 在线看片欧美| 久久www免费人成看片高清| 先锋亚洲精品| 国产精品国产三级欧美二区| 日韩视频免费在线| 99精品欧美一区二区三区 | 国产精品免费观看视频| 亚洲精品国产无天堂网2021| 亚洲第一成人在线| 欧美一区二区在线播放| 午夜欧美大片免费观看| 欧美性大战久久久久久久蜜臀| 亚洲国产欧美不卡在线观看| 亚洲国产精品精华液2区45| 欧美制服丝袜第一页| 久久婷婷蜜乳一本欲蜜臀| 国模精品娜娜一二三区| 久久久久久噜噜噜久久久精品| 久久精品亚洲| 一区在线播放| 你懂的成人av| 99视频国产精品免费观看| 99热在线精品观看| 欧美午夜不卡在线观看免费| 亚洲专区欧美专区| 久久精品视频在线观看| 在线观看的日韩av| 免费在线一区二区| 日韩午夜av电影| 欧美在线播放| 在线观看亚洲专区| 欧美精品一卡| 亚洲欧美精品在线观看| 久久一区二区三区超碰国产精品| 亚洲国产一成人久久精品| 欧美精品在线免费播放| 亚洲在线视频免费观看| 另类成人小视频在线| 日韩亚洲不卡在线| 国产精品久久久久aaaa| 久久九九免费| 亚洲午夜av| 国产一区二区在线观看免费| 久久一区激情| 亚洲一区激情| 免费观看国产成人| 制服丝袜激情欧洲亚洲| 国产午夜久久久久| 欧美成人嫩草网站| 亚洲摸下面视频| 亚洲国产精品免费| 久久福利一区| 一区二区三区视频在线播放| 国产一级精品aaaaa看| 欧美日韩精品免费观看视频完整| 午夜视频久久久久久| 亚洲免费av片| 欧美国产日本高清在线| 午夜精品一区二区在线观看| 亚洲激情六月丁香| 国产一本一道久久香蕉| 欧美偷拍一区二区| 欧美大片一区二区三区| 欧美在线一二三区| 一区二区三区久久| 亚洲成色777777女色窝| 久久aⅴ乱码一区二区三区| 一区二区久久| 亚洲激情在线激情| 国内精品久久久久影院色| 国产精品嫩草久久久久| 欧美乱在线观看| 久久综合九色九九| 欧美一区二区三区在线免费观看| 一区二区三区视频免费在线观看| 亚洲国产高清在线| 欧美成人一区二区三区在线观看 |