Windows 中 RTL_CRITICAL_SECTION 结构的 LockCount 字段是否可以合法为负数?
我们正在跟踪一次非常难以捉摸的崩溃,我们看到的一个症状是 CS 的 LockCount 为负值。崩溃时,计数为 -6,但通常似乎为 -1、-2 等。
在假设发生这种情况是一件非常糟糕的事情之前,我只想验证一下这个假设是否正确。我几乎找不到有关 RTL_CRITICAL_SECTION 内部工作原理的信息。
在某些 Windows 版本上,负锁定计数是正常行为。请注意,该字段的含义在 Windows 的生命周期中发生了变化(见下文)。
解释这些私有字段是一件棘手的事情,您可能会从使用专用的关键部分调试工具中受益。
例如,参见这个MSDN 文章给出了一些细节。特别是,我认为它说明了为什么值 -6 是完全合理的。
一些相关摘录:
可以通过多种不同的方法在用户模式下显示关键部分。每个字段的确切含义取决于您所使用的 Microsoft Windows 版本。
......
在 Microsoft Windows 2000 和 Windows XP 中,LockCount 字段指示任何线程为此临界区调用 EnterCriticalSection 例程的次数,减一。对于未锁定的关键部分,该字段从 -1 开始。每次调用 EnterCriticalSection 都会增加该值;每次调用 LeaveCriticalSection 都会减少它。例如,如果 LockCount 为 5,则该临界区被锁定,一个线程已获取该锁,并且另外 5 个线程正在等待该锁。
......
在 Microsoft Windows Server 2003 Service Pack 1 及更高版本中
Windows下,LockCount字段解析如下:
- 最低位显示锁定状态。如果该位为 0,则临界
部分被锁定;如果为1,则临界区未被锁定。
- 下一位显示是否已为此锁唤醒线程。如果
该位为0,则表示已经有一个线程被该锁唤醒;如果是1,
没有线程被唤醒。
- 其余位是线程数的反码
等待锁。
然后继续解释如何解释锁定计数-22
。因此,总而言之,这比您想象的要棘手!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)