![](/img/trans.png)
[英]What will be the critical section code for a shared queue accessed by two threads?
[英]Dump Critical Section Queue (Threads waiting)
我有一個問題(崩潰轉儲),我的關鍵部分被破壞了,但是在檢查LockCount之后,我注意到有1個線程在等待它(似乎該線程已被喚醒,但尚未進入,因為鎖定狀態為Not已鎖定)。
我想看看什么線程被喚醒。 我知道關鍵部分有一個等待線程的隊列,如果我可以轉儲此隊列/列表結構,我應該可以回答我的問題,關於我能做什么的任何想法?
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報告該字段實際上包含線程ID本身。
您可以使用
GetThreadInformation(OwningThread,....);
獲取更多線程詳細信息。
在這種情況下, 必須閱讀 Windows上MSDN上關鍵部分中的代碼死鎖 。 格外的EntryCount/ContentionCount
領域RTL_CRITICAL_SECTION_DEBUG
結構可能會給出一個答案,這里的問題。
您嘗試過!鎖嗎? 這里有有關在WinDBG文檔中查看過程中關鍵部分的信息:
http://msdn.microsoft.com/zh-CN/library/windows/hardware/ff541979(v=vs.85).aspx
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.