2009-06-17 6 views
2

안녕 모두들,dll에서 교수형 스레드를 올바르게 종료하는 방법은 무엇입니까?

나는 오류가 포함 된 타사 라이브러리가 있습니다. 함수를 호출하면 멈출 수 있습니다. 라이브러리 함수는 dll 내부에서 호출됩니다. 호출을 스레드로 옮기고 잠시 기다리기로 결정했습니다. 스레드가 완료되면 확인을 누릅니다. 그렇지 않으면 강제로 해지해야합니다. 여기

단순화 된 예 :

unsigned Counter = 0; 
void f() 
{ 
    HANDLE hThread; 
    unsigned threadID; 

    // Create the second thread. 
    hThread = (HANDLE)_beginthreadex(NULL, 0, DoSomething, NULL, 0, &threadID); 

    if (WAIT_TIMEOUT == WaitForSingleObject(hThread, 5000)) 
    { 
     TerminateThread(hThread, 1);  
     wcout << L"Process is Timed Out"; 
    } 
    else 
    { 
     wcout << L"Process is Ended OK"; 
    } 

    CloseHandle(hThread); 

    wcout << Counter; 
} 

unsigned int _stdcall DoSomething(void * /*dummy*/) 
{ 
    while (1) 
    { 

     ++Counter; 

    } 
    _endthreadex(0); 
    return 0; 
} 

[질문

  1. TerminateThread를() 함수를 호출하지 않는 것이 좋습니다.
  2. 앞서 언급했듯이이 스레드는 안에 으로 실행됩니다. TerminateThread()을 사용하여 스레드를 종료하는 경우 FreeLibrary() 또는 FreeLibraryAndExitThread()을 사용하여 내 dll을 언로드하지 않았습니다. 두 기능이 정지합니다.

스레드를 종료하고 유지하는 방법 FreeLibrary()이 작동합니까?

감사합니다.

+2

아마도 당신은 별도의 프로세스에서 루즈 dll 호스팅을 살펴보고 물건이 배 모양이되면 프로세스를 죽이는 것이 좋을까요? –

답변

11

아쉽게도 스레드를 안전하게 임의로 종료 할 수 없습니다.

스레드가 잠금을 유지하거나 내부 상태를 수정하는 경우에도 TerminateThread는 스레드가 즉시 종료되도록합니다. TerminateThread는 응용 프로그램에서 스레드가 잠금을 유지하는 경우 임의의 중단을 초래할 수 있으며 충돌이 발생합니다 (스레드가 일부 상태를 수정하고 일관성이없는 경우).

DLL이 올바르게 동작하도록 신뢰할 수 없으면 중요한 안정성 문제가 발생하면 DLL을 호출하는 코드를 별도의 프로세스로 옮겨야합니다. 프로세스를 종료하는 것이 훨씬 안전합니다.

+0

스레드를 갑자기 종료하는 함정에 대한 통찰력이 있습니다. – nsantorello

+0

감사합니다. 귀하의 충고에 기뻐합니다. – Mar

+0

스레드가 종료 될 수 있다고 생각한 결과로 생산 시스템을 처리 한 후이 작업을 두 번 upvote 할 수 있기를 바랍니다. –

관련 문제