2011-11-18 2 views
3

실제로 검색 할 내용은 .net 에 대한 C++/win32와 동일합니다.Win32 스레드가 C++에서 Wait, Join 또는 Sleep 상태에 있음을 확인하는 방법

제안 사항?

+0

NtQuerySystemInformation()하지만 설명되어 있지 않습니다. Win32_Thread 클래스를 사용하는 WMI 만 문서화되어 있습니다. –

+0

정말 고마워요. 답변 해 주셔서 감사합니다. 그러나 BOOL IsThreadInWaitJoinSleep (handle threadHandle)과 같은 것을 찾고 있습니까? 다른 제안? – Honzajscz

+1

당신은 그것을 얻을 수 없습니다. 파일을 열려고하지 않고 파일이 잠겨 있다는 사실을 알 수없는 것과 같은 이유입니다. 이러한 작업은 멀티 태스킹 운영 체제에서 절망적으로 사용할 수 없기 때문에. 나노초 후에 파일이 잠길 수 있습니다. 또는 스레드가 차단되었을 수 있습니다. –

답변

3

이들의 차이점은 모두 다른 커널 객체를 기다리는 것입니다.

"대기" "I/O 대기"라고 가정합니다. "Join"은 "스레드/프로세스 대기"입니다. "잠자기"는 "타이머 대기 중"입니다.

문제가 더 복잡해지면 스레드가 커널 개체의 조합을 기다릴 수 있습니다.

커널 디버거를 사용하여 스레드가 대기중인 개체와 이러한 개체의 유형을 알 수 있습니다. 나는 더 간단한 방법이 있다고 생각하지 않는다.

2

동일한 직접 관리 - 관리되지 않는 스레드와 동일한 것으로 간주되어서는 안됩니다. here을 참조하십시오.

단독 호스트 관리 및 비 관리 스레드의 관계를 제어 할 수 있기 때문에, 관리 실에 고정 된 관계가없는 ThreadId 오퍼레이팅 시스템. 특히 정교한 호스트 은 파이버 API를 사용하여 동일한 운영 체제 스레드에 대해 많은 관리 스레드를 예약하거나 관리되는 스레드를 다른 운영 체제 스레드로 이동시킬 수 있습니다.

1

winapi를 사용하여 쉽게 액세스 할 수있는 네이티브 스레드의 유일한 상태는 스레드가 실행을 완료하면 알 수 있습니다. 그냥 스레드 핸들과 0의 타임 아웃 기능 WaitForSingleObject()를 사용

DWORD res = WaitForSingleObject(handleThread, 0); 
switch (res) 
{ 
    case WAIT_OBJECT_0: 
     printf("The thread has finished\n"); 
     break; 
    case WAIT_TIMEOUT: 
     printf("The thread is still running\n"); 
     break; 
    default: 
     printf("Unknown error (shouldn't happen)\n"); 
     break; 

} 
1

은 "문제"는 .NET 런타임이 .NET 스레드의 소유권을 가지고 있다는 것입니다. 예를 들어 Abort를 호출하면 내부 런타임은 .NET 스레드의 .NET 컨텍스트에서 ThreadAbortException 예외를 throw하므로 catch (ThreadAbortException)를 사용하여 스레드에서 catch 할 수 있습니다.

스레드의 소유권을 가지고 있기 때문에 ThreadState에서도 마찬가지입니다. 스레드가 무엇을하는지 정확히 알고 있으므로 유효한 스레드 상태를 생성 할 수 있습니다.

공식적으로 내부 상태에 대한 스레드를 쿼리하는 비 해킹 방법이 없으므로이를 클래스로 마무리 할 수 ​​있습니다. 그러나 다시 한번, 당신은 전적으로 스레드 메소드에 의존하여 .Abort() 요청을 고수 할 것입니다.