2012-08-17 2 views
0

크리티컬 섹션이 손상되는 곳에서 문제가 발생하지만 LockCount를 검사 한 결과 스레드가 대기중인 스레드가 1 개 있음을 알 수 있습니다 (스레드가 깨 닳은 것으로 보입니다) 잠금 상태가 잠기지 않았으므로 아직 입력되지 않았습니다.크리티컬 섹션 대기열 덤프 (스레드 대기 중)

나는 어떤 스레드가 깨어 났는지보고 싶습니다. 내가 중요 섹션 대기 스레드의 대기열을 알고, 내가이 큐/목록 구조를 뽑을 수 있다면 내 질문에 대답 할 수 있어야한다, 어떤 생각이 내가 할 수있는 일이야?

+0

: 여기 WinDBG로 워드 프로세서의 과정에서 중요한 부분을 보는 방법에 대한 정보가 있습니다. 어쩌면이 페이지가 도움이 될까요? http://msdn.microsoft.com/en-us/library/dd554943.aspx – jxh

+0

잘 모르겠 음 - CS를 파괴하고있는 것은 무엇입니까? –

+0

@MartinJames 명확하지 않은 점에 대해 사과드립니다. 내 개체 중 하나의 소멸자는 중요한 섹션을 삭제하는 것입니다 (괜찮습니다). 그러나 다른 곳에서 CS를 얻기 위해 깨어 난 실이 있습니다. 쓰레드가 깨어나서 입력되지 않았기 때문에 CS! cs -s 주소는 CS를 소유 한 쓰레드를 보여주지 않습니다. –

답변

0

크리티컬 섹션 개체가 소유하는 스레드에 대한 핸들을 포함

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로 정의 RTL_CRITICAL_SECTION

typedef RTL_CRITICAL_SECTION CRITICAL_SECTION; 

으로 정의된다. CriticalSection 데이터 구조를 읽으면 소유 스레드의 핸들을 얻을 수 있습니다.

DWORD WINAPI GetThreadId(_In_ HANDLE OwningThread); 

은 소유 스레드의 ID를 반환합니다.

그러나 OwningThread의 정의가있는 작은 사고가 있습니다. MSDN은 필드에 실제로 스레드 ID 자체가 있음을보고합니다.

당신은

GetThreadInformation(OwningThread,....); 

더 많은 스레드 정보를 얻기 위해 사용할 수 있습니다.

Break Free of Code Deadlocks in Critical Sections Under Windows (MSDN에서 이어야합니다.) 특히 RTL_CRITICAL_SECTION_DEBUG 구조의 EntryCount/ContentionCount 필드는 여기에 대한 질문에 대한 답을 줄 수 있습니다.

+0

이것은 내가 보통하는 일이다. 그러나 나는 OwningThread에 대해 null이되지만 LockCount는 하나의 스레드가 대기 중이며 깨어 났다고 제안합니다. 나는 아직 CS에 들어갈 수 없다고 생각했다. –

+0

LockCount의 오해가 있는지 궁금합니다. MSDN의 [this] (http://msdn.microsoft.com/en-us/magazine/cc164040.aspx)를 참조하십시오. – Arno

+0

LockCount의 의미는 Sever 2003부터 약간 변경되었습니다. 나는 그것을 정확하게 해석했다는 것을 확신한다. 나는 개별 부분 (즉, 쓰레드 상태, 깨어나는 쓰레드와 쓰레드 잠금을 기다리는)을 해결하기 위해 bitness 작업을 약간했다. –

0

잠금을 시도 했습니까? 당신은 모든 스레드의 스택 트레이스를 얻기 위해 시도해야

http://msdn.microsoft.com/en-us/library/windows/hardware/ff541979(v=vs.85).aspx

+0

예. 문제는 내가 CS의 주소를 알고 있으며 아직 소유 스레드가 없다는 것을 알고 있습니다. 스레드가 깨어 났지만 아직 CS에 들어 가지 않았다고 생각합니다. 나는 깨어 난 실을 찾고 싶었습니다. –