2009-11-10 8 views
0

나는 그것을 할 수있는 WINAPI가 없다는 것을 알고 있습니다. 그러나 스레드가 매달려 있고 파일의 열린 핸들을 보유하고 있다면 알 수 있습니다. 어떻게 스레드 ID를 결정하고 프로세스 내에서 종료 할 수 있습니까?파일에 자물쇠를 보유하고있는 스레드를 확인하십시오.

다른 프로세스에서는 파일 잠금을 해제하는 것이 아니라 자체 프로세스 내에서 파일 잠금을 해제하는 방법에 대해 설명합니다.

핸들을 닫지 않고 스레드가 충돌하거나 종료 될 수도 있습니다.

+0

특정 상황에서 또는 매번 파일 처리 중 스레드가 차단됩니까? – ChadNC

+0

잘 특정 상황에서,하지만 그 별도의 영역에서 나는 그 파일을 삭제했습니다,하지만 그것은 내 자신의 프로세스를 알고 있기 때문에 액세스 거부 오류가 스레드를 알아낼 수 있다면, 나는 그것을 종료하거나 가까이 핸들 또는 심지어 수 있습니다 어떤 스레드와 왜 디버깅을하는지 알아보십시오. – AppDeveloper

+0

TerminateThread를 호출해서는 안됩니다. http://stackoverflow.com/questions/1004676/how-to-terminate-a-hanging-thread-inside-a-dll-correctly/을 참조하십시오. 1004684 # 1004684. – Michael

답변

0

파일에 열린 핸들을 보유하고있는 스레드를 확인할 수 없습니다. 파일 핸들을 포함하여 거의 모든 커널 핸들은 스레드와 관련이 없으며 프로세스와 만 연결됩니다 (뮤텍스는 예외입니다. 소유 스레드의 개념이 있습니다.)

다음 코드가 있다고 가정합니다. 어떤 스레드가 파일 핸들을 "소유"합니까?

void FuncCalledOnThread1() 
{ 
    HANDLE file = CreateFile(...); 

    // Hand off to a background thread. 
    PostWorkItemToOtherThread(FuncCalledOnThread2, file); 
} 

void FuncCalledOnThread2(HANDLE file) 
{ 
     DoSomethingWithFile(file); 
     CloseHandle(file); 
} 
+0

좋은 지적 .나는 다른 누군가의 참조를 위해 핸들을 열거하기위한 소스를 찾았지만. http://forum.sysinternals.com/forum_posts.asp?TID=18892 – AppDeveloper

0

당신은 이런 디버거를 프로세스에 연결할 수있는 프로그램이 원인이 된 스레드에 대한 검색을 일시 중지하고, 횡단 스택, 수행중인 작업, 실행중인 코드 및 스택에있는 변수를 찾습니다.

잠금을 위해 RAII를 사용한 경우 잠금 장치가 스택에 있어야하므로 잠금으로 사용해야합니다.

+0

고객 시스템에서 디버그하지 못하게 할 수는 없습니다. :(.. aaaah RAII 10 년 동안 작성된 1.5 밀리미터의 코드 라인 .. .. 나는 단지 그것을 고치고 있습니다. – AppDeveloper

+0

당신은 영웅입니다. 나는 한 번 여러 MLoC C++ 프로젝트에서 일했습니다. 커널도 열 살이었습니다.하지만 그건 가장 오래된 부분에서도 (그리고 최신 커널에서도 좋았습니다) 어쨌든 MT 버그에서 알 수있는 유일한 방법은 로깅, 로깅 및 로깅입니다. – sbi

0

MSDN을 탐색하는 데 아무 것도 보지 못했지만 분명히 문서화되지 않은 무언가가있어 필요한 정보를 얻을 수 있습니다.

스레드가 이러한 리소스를 만드는 중이고 이러한 스레드 중 하나가 점심을 먹을 것으로 예상되는 경우 유틸리티 스레드에서 리소스를 쿼리하여 스레드를 만들고 처리하는 것이 더 바람직할까요? 자원? 이러한 스레드는 크래시가 발생하지 않으며 크래시 발생시 자원 스레드가 실제로 이러한 핸들의 소유자임을 항상 알 수 있습니다.

관련 문제