The ExitThread function ends a thread.
定義
VOID ExitThread(DWORD dwExitCode);
參數
dwExitCode
Exit code for the calling thread. Use the GetExitCodeThread function to retrieve a thread's exit code.
返回值
This function does not return a value.
說明
ExitThread is the preferred method of exiting a thread in C code. However, in C++ code, the thread is exited before any destructors can be called or any other automatic cleanup can be performed. Therefore, in C++ code, you should return from your thread function.
When this function is called (either explicitly or by returning from a thread procedure), the current thread's stack is deallocated, all pending I/O initiated by the thread is cancelled, and the thread terminates. The entry-point function of all attached dynamic-link libraries (DLLs) is invoked with a value indicating that the thread is detaching from the DLL.
If the thread is the last thread in the process when this function is called, the thread's process is also terminated.
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.
Terminating a thread does not necessarily remove the thread object from the operating system. A thread object is deleted when the last handle to the thread is closed.
The ExitProcess, ExitThread, CreateThread, CreateRemoteThread functions, and a process that is starting (as the result of a CreateProcess call) are serialized between each other within a process. Only one of these events can happen in an address space at a time. This means the following restrictions hold:
- During process startup and DLL initialization routines, new threads can be created, but they do not begin execution until DLL initialization is done for the process.
- Only one thread in a process can be in a DLL initialization or detach routine at a time.
- ExitProcess does not return until no threads are in their DLL initialization or detach routines.
A thread in an executable that is linked to the static C run-time library (CRT) should use _beginthread and _endthread for thread management rather than CreateThread and ExitThread. Failure to do so results in small memory leaks when the thread calls ExitThread. Another work around is to link the executable to the CRT in a DLL instead of the static CRT. Note that this memory leak only occurs from a DLL if the DLL is linked to the static CRT and a thread calls the DisableThreadLibraryCalls function. Otherwise, it is safe to call CreateThread and ExitThread from a thread in a DLL that links to the static CRT.
系統要求
Client: Requires Windows XP, Windows 2000 Professional, Windows NT Workstation, Windows Me, Windows 98, or Windows 95.
Server: Requires Windows Server 2003, Windows 2000 Server, or Windows NT Server.
Header: declared in Winbase.h; include Windows.h.
Library: Link to Kernel32.lib.
DLL: Requires Kernel32.dll
示例:
#include <Windows.h>
#include <stdio.h>
#include <time.h>
DWORD WINAPI ThreadFunc(LPVOID pParam) ;
void AnotherFunc() ;
DWORD exitCode ;
int main(int argc, char* argv[])
{
HANDLE hThread ;
DWORD dwThreadID ;
hThread = CreateThread(NULL , 0UL , ThreadFunc , (LPVOID)1 , 0 , &dwThreadID) ;
if(hThread) printf("執行緒已經啟動\n") ;
for(;;)
{
BOOL rc = GetExitCodeThread(hThread , &exitCode) ;
if(rc && exitCode != STILL_ACTIVE) break;
}
CloseHandle(hThread) ;
printf("執行緒的返回碼是 %d\n" , exitCode) ;
return EXIT_SUCCESS ;
}
DWORD WINAPI ThreadFunc(LPVOID pParam)
{
printf("執行緒開始運行...\n") ;
AnotherFunc() ;
return 0;
}
void AnotherFunc()
{
srand((unsigned)time(NULL)) ;
DWORD dwYourExitCode = rand()%20 ;
printf("強制退出執行緒\n") ;
ExitThread(dwYourExitCode) ;
printf("強制退出執行緒時 , 這句話不會被執行。\n") ;
}