본문 바로가기
프로그래밍

스레드 종료(TerminateThread API)에 대해서... ]

by ictlab 2009. 10. 9.

출처 갱주니 블로그(AiWisdom) | 갱주니
원문 http://blog.naver.com/process3/20021429196

TerminateThread

The TerminateThread function terminates a thread.

(TerminateThread 함수는  스레드를 종료(정지)시키는 함수이다.)

BOOL TerminateThread( HANDLE hThread,  DWORD dwExitCode ); 

Parameters

hThread
[in, out] Handle to the thread to terminate.

The handle must have the THREAD_TERMINATE access right. For more information, see Thread Security and Access Rights.

(종료를 원하는 스레드 핸들이다. 이 핸들은 THREAD_TERMINATE access 권한을 꼭 가지고 있어야 한다.)

dwExitCode
[in] Exit code for the thread. Use the GetExitCodeThread function to retrieve a thread's exit value.

Return Values

If the function succeeds, the return value is nonzero.

If the function fails, the return value is zero. To get extended error information, call GetLastError.

(리턴 값이 nonzero 이면 성공이다. 리턴값이 0 이면 GetLastError() 함수를 이용해서 확장된 에러 정보를 확인해야 한다.)

Remarks

TerminateThread is used to cause a thread to exit. When this occurs, the target thread has no chance to execute any user-mode code and its initial stack is not deallocated. DLLs attached to the thread are not notified that the thread is terminating.

(TerminateThread 함수를 사용하면 스레드가 종료된다.(당근이쥐^^). 그런데 TerminateThread를 받게 되는 타겟 스레드는 유저모드에서 생성해 놓은 스택 또는 코드 데이타를 deallocated 할수있는 기회조차 없이 스레드가 종료된다. DLL에 attached 된 스레드에게도 알려주지 않는다.(not notified))


TerminateThread is a dangerous function that should only be used in the most extreme cases. You should call TerminateThread only if you know exactly what the target thread is doing, and you control all of the code that the target thread could possibly be running at the time of the termination. For example, TerminateThread can result in the following problems:

(TerminateThread는 매우 위험한 함수이다. 이 함수는 사용은 가장 극단적인 경우일때에만 사용해야 한다. 즉, TerminateThread 함수를 사용할때에는 정확히 이함수 사용후에 타켓스레드가 어떻게 동작할 지 예측할수 있는 경우에만 사용해야 한다. 이렇게 하는 이유는 아래 경우 때문이다.)


-If the target thread owns a critical section, the critical section will not be released.

(타겟 스레드가 critical section을 가지고 있다면 이 critical section은 해제 되지 않는다.)

-If the target thread is allocating memory from the heap, the heap lock will not be released.

(타켓 스레드가 힙영역에 메로리가 할당되어있다면 이 메모리는 해제 되지 않는다.)

-If the target thread is executing certain kernel32 calls when it is terminated, the kernel32 state for the thread's process could be inconsistent.

(타겟 스레드가 어떤 특정한 kernel32 함수를 호출한후 종료되면(리턴 또는 kernel32 호출한 후 처리를 제대로 하지않고 종료되면), 이 스레드를 가지고 있는 프로세스가 불안정하게 된다.)

-If the target thread is manipulating the global state of a shared DLL, the state of the DLL could be destroyed, affecting other users of the DLL.

(만약 스레드가 global state of a shared DLL을 변경 또는 조작한후 이 DLL이 종료된후(destroyed) global state of a shared DLL을 공유하고 있는 다른 DLL에 영향을 준다.)


A thread cannot protect itself against TerminateThread, other than by controlling access to its handles. The thread handle returned by the CreateThread and CreateProcess functions has THREAD_TERMINATE access, so any caller holding one of these handles can terminate your thread.

(스레드 핸들을 이용해서 TerminateThread API 호출에 대해서 보호하지 못한다. 즉, CreateThread and CreateProcess 함수 호출후 리턴되는 핸들과 이 핸들에 THREAD_TERMINATE 권한을 가지고 있다면 다른 어떤한 곳에서도 TerminateThread함수를 호출할 수 있다.)


If the target thread is the last thread of a process when this function is called, the thread's process is also terminated.

(만약에 프로세스 내에 마지막 스레드에 TerminateThread를 호출하면 이 스레드를 가지고 있는 프로세스도 같이 종료된다.)


The state of the thread object becomes signaled, releasing any other threads that had been waiting for the thread to terminate. The thread's termination status changes from STILL_ACTIVE to the value of the dwExitCode parameter.

(스레드에 signal되면(신호가 오면) 스레드가 종료되기를 기다린다. 그런데 스레드에 종료 신호가 오면 termination status 를 STILL_ACTIVE 값에서dwExitCode parameter로 온값으로 변경한다.)


Terminating a thread does not necessarily remove the thread object from the system. A thread object is deleted when the last thread handle is closed.

(스레드를 Terminating 하면 시스템에서 스레드 오브젝트를 제거 하지 않는다. 스레드는 자기가 가지고있는 모든 핸들이 종료(close)되어야만 스레드 오브젝트가 시스템에서 삭제된다.)