Windows关键部分在什么情况下可能具有负锁定计数?

时间:2011-09-13 21:23:21

标签: c windows critical-section

在Windows中,RTL_CRITICAL_SECTION结构的LockCount字段是否合法地可以为负数?

我们正在跟踪非常难以捉摸的崩溃,我们看到的一个症状是具有负LockCount的CS。在崩溃时,计数是-6,但似乎通常是-1,-2等。

在此之前追逐之前,假设这是一件非常糟糕的事情,我只是想验证这个假设是否正确。我几乎找不到关于RTL_CRITICAL_SECTION的内部工作原理的信息。

2 个答案:

答案 0 :(得分:12)

在某些Windows版本上,负锁定计数是正常行为。请注意,在Windows的生命周期中,此字段的含义已更改(请参阅下文)。

解释这些私有字段是一件棘手的事情,您可能会受益于使用专用的关键部分调试工具。

例如,请参阅此MSDN article提供一些详细信息。特别是我认为它显示为什么-6的值是完全合理的。

一些相关的摘录:

  

关键部分可以通过各种不同的方法在用户模式下显示。每个字段的确切含义取决于您使用的Microsoft Windows版本。

     

...

     

在Microsoft Windows 2000和Windows XP中,LockCount字段指示任何线程为此关键部分调用EnterCriticalSection例程减去1的次数。对于未锁定的关键部分,此字段从-1开始。每次调用EnterCriticalSection都会递增此值;每次调用LeaveCriticalSection都会减少它。例如,如果LockCount为5,则此关键部分被锁定,一个线程已获取它,另外五个线程正在等待此锁定。

     

...

     

在Microsoft Windows Server 2003 Service Pack 1及更高版本的   在Windows中,LockCount字段的解析如下:

     
      
  • 最低位显示锁定状态。如果该位为0,则为关键   部分被锁定;如果为1,则关键部分未锁定。
  •   
  • 下一位显示是否已为此锁定唤醒线程。如果   这个位是0,然后一个线程被唤醒了这个锁;如果是1,   没有线程被唤醒。
  •   
  • 其余位是线程数的补码   等待锁定。
  •   

然后继续解释如何解释锁定计数-22。所以,总而言之,它比你想象的更棘手!

答案 1 :(得分:5)

来自here,是部分解释:

  

LockCount 这是关键部分中最重要的字段。   它被初始化为-1的值;值为0或更大表示   关键部分是持有或拥有的。当它不等于-1时   OwningThread字段(此字段未正确定义   WINNT.H-它应该是DWORD而不是HANDLE)包含线程   拥有此关键部分的ID。这个字段和。之间的差异   (RecursionCount -1)的值表示有多少额外的线程   正在等待获得关键部分。