TerminateThread在
线程外终止一个线程,用于强制终止线程。
声明
BOOLTerminateThread( HANDLEhThread,DWORDdwExitCode);
作用
在线程外终止一个线程,用于强制终止线程。
参数
HANDLE hThread:被终止的线程的句柄,为CWinThread
指针。
DWORD dwExitCode:退出码。
返回值
函数执行成功则返回
非零值,执行失败返回0。调用
getlasterror获得返回的值。
注意
避免在new和delete之间执行TerminateThread,否则程序将不能在继续使用new了。
终止运行
若要终止线程的运行,可以使用下面的方法:
·线程函数返回(最好使用这种方法)。
· 通过调用E x i t T h r e a d函数,线程将自行撤消(最好不要使用这种方法)。
· 同一个进程或另一个进程中的线程调用Te r m i n a t e T h r e a d函数(应该尽量避免使用这种方法)。
· 包含线程的进程终止运行(应该尽量避免使用这种方法)。
区分
ExitThread函数
可以让线程调用ExitThread函数,以便强制线程终止运行:
该函数将终止线程的运行,并导致操作系统清除该线程使用的所有操作系统资源。但是,C++资源(如C++类对象)将不被撤消。由于这个原因,最好从线程函数返回,而不是通过调用ExitThread来返回。
当然,可以使用ExitThread的dwExitThread参数告诉系统将线程的退出代码设置为什么。ExitThread函数并不返回任何值,因为线程已经终止运行,不能执行更多的代码。
注意终止线程运行的最佳方法是让它的线程函数返回。但是,如果使用本节介绍的方法,应该知道ExitThread函数是Wi n d o w s用来撤消线程的函数。如果编写C/C++代码,那么决不应该调用ExitThread。应该使用Visual C++运行期
库函数_endthreadex。如果不使用Microsoft的Visual C++
编译器,你的编译器供应商有它自己的ExitThread的替代函数。不管这个替代函数是什么,都必须使用。
TerminateThread函数
调用TerminateThread函数也能够终止线程的运行:
与ExitThread不同,ExitThread总是撤消调用的线程,而TerminateThread能够撤消任何线程。hThread参数用于标识被终止运行的线程的句柄。当线程终止运行时,它的退出代码成为你作为dwExitCode
参数传递的值。同时,线程的
内核对象的使用计数也被递减。
注意TerminateThread函数是异步运行的
函数,也就是说,它告诉系统你想要线程终止运行,但是,当函数返回时,不能保证线程被撤消。如果需要确切地知道该线程已经终止运行,必须调用WaitForSingleObject或者类似的函数,传递线程的
句柄。
设计良好的应用程序从来不使用这个函数,因为被终止运行的线程收不到它被撤消的通知。线程不能正确地清除,并且不能防止自己被撤消。注意当使用返回或调用ExitThread的方法撤消线程时,该线程的内存
堆栈也被撤消。但是,如果使用TerminateThread,那么在拥有线程的进程终止运行之前,系统不撤消该线程的堆栈。Microsoft故意用这种方法来实现TerminateThread。如果其他仍然正在执行的线程要引用强制撤消的线程堆栈上的值,那么其他的线程就会出现访问违规的问题。如果将已经撤消的线程的堆栈留在内存中,那么其他线程就可以继续很好地运行。此外,当线程终止运行时, DLL通常接收通知。如果使用Terminate Thread 强迫线程终止,DLL就不接收通知,这能阻止适当的清除