2012-08-17 53 views
0

我有一个问题(崩溃转储),其中我的关键部分正在销毁,但在检查LockCount后,我注意到有一个线程在等待它(似乎线程已被唤醒,但尚未输入,因为锁定状态为未锁定)。转储关键部分队列(线程等待)

我想看看什么线程已被唤醒。我知道关键部分有一个等待线程的队列,如果我可以转储这个队列/列表结构,我应该能够回答我的问题,关于我能做什么的任何想法?

+0

你应该尝试的堆栈跟踪的所有线程。也许这个网页会有帮助? http://msdn.microsoft.com/en-us/library/dd554943.aspx – jxh 2012-08-17 08:57:23

+0

不知道我明白 - 什么是摧毁CS? – 2012-08-17 08:57:35

+0

@MartinJames对不起,不清楚。我的一个对象的析构函数正在删除关键部分(这没关系)。但是有一个线索已经被唤醒在其他地方获得CS。由于线程刚刚被唤醒,所以没有进入CS!cs -s地址显示没有线程拥有CS。 – 2012-08-17 09:00:19

回答

0

的CriticalSection的对象被定义为

typedef RTL_CRITICAL_SECTION CRITICAL_SECTION; 

RTL_CRITICAL_SECTION定义为

typedef struct _RTL_CRITICAL_SECTION { 
    PRTL_CRITICAL_SECTION_DEBUG DebugInfo; 
    LONG LockCount; 
    LONG RecursionCount; 
    HANDLE OwningThread;  // from the thread's ClientId->UniqueThread 
    HANDLE LockSemaphore; 
    ULONG_PTR SpinCount;  // force size on 64-bit systems when packed 
} RTL_CRITICAL_SECTION, *PRTL_CRITICAL_SECTION; 

OwningThread将包含的句柄拥有线程。 所以你可能只是阅读CriticalSection数据结构来获取拥有线程的句柄。

DWORD WINAPI GetThreadId(_In_ HANDLE OwningThread); 

将返回拥有线程的ID。

但是,OwningThread的定义存在一个小小的错误。 MSDN报告该字段实际上包含线程标识本身。

您可以使用

GetThreadInformation(OwningThread,....); 

获得更多线程的详细信息。

Break Free of Code Deadlocks in Critical Sections Under Windows MSDN上是必须在这种情况下阅读。特别是RTL_CRITICAL_SECTION_DEBUG结构中的EntryCount/ContentionCount字段可能会给出这里问题的答案。

+0

这是我通常做的。然而,我为OwningThread得到了null,但是我的LockCount表明一个线程正在等待并且已经被唤醒。我想也许它还没有进入CS。 – 2012-08-17 09:09:42

+0

我想知道LockCount是否存在误解。请参阅MSDN上的[this](http://msdn.microsoft.com/zh-cn/magazine/cc164040.aspx)。 – Arno 2012-08-17 09:16:44

+0

LockCount的含义从Sever 2003起略有变化。我很确定我已经正确解释了它,我只是做了一些简单的操作来计算出各个部分(即线程状态,线程唤醒和等待锁定的线程)。 – 2012-08-17 09:33:39