2011-09-13 21 views
7

是否有任何情况下Windows中的RTL_CRITICAL_SECTION结构的LockCount字段可以合法地为负数?在什么情况下Windows Critical Section可能会有负锁定计数?

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

之前,在假设这是一件非常不好的事情发生,我只想验证那个假设是正确的。我几乎找不到有关RTL_CRITICAL_SECTION内部工作的信息。

回答

11

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

解读这些私人领域是一件棘手的事情,您可能会从使用专用的关键部分调试工具中受益。

例如,看到这个MSDN article给出了一些细节。特别是我认为这说明了为什么-6的值是完全合理的。

一些相关的摘录:

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

......

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

......

在Microsoft Windows Server 2003 Service Pack 1和 更高版本的Windows中,锁定计数字段如下解析:

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

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

5

here,是一个组成部分的解释:

锁定计数这是一个关键的部分最重要的领域。 它被初始化为值-1; 0或更大的值表示 关键部分被持有或拥有。当它不等于-1, 时,OwningThread字段(该字段在 WINNT.H中错误地定义 - 它应该是DWORD而不是HANDLE)包含线程 拥有此关键部分的ID。此字段与 之间的增量(RecursionCount -1)的值指示有多少额外的线程 正在等待获取关键部分。

+2

“0或更大的值表示临界区被占有或拥有”可能是真的,但在现代Windows上不再是真的。 –

+0

此答案已过时,应删除。 –

相关问题