若要终止线程的运行,可以使用下面的方法:
* 线程函数返回(最好使用这种方法)。
* 通过调用ExitThread函数,线程将自行撤消(最好不要使用这种方法)。
* 同一个进程或另一个进程中的线程调用TerminateThrea函数(应该避免使用这种方法)。
* 包含线程的进程终止运行(应该避免使用这种方法)。
线程函数返回
这是确保所有线程资源被正确地清除的唯一办法。
如果线程能够返回,就可以确保下列事项的实现:
* 在线程函数中创建的所有C++对象均将通过它们的撤消函数正确地撤消。
* 操作系统将正确地释放线程堆栈使用的内存。
* 系统将线程的退出代码(在线程的内核对象中维护)设置为线程函数的返回值。
* 系统将递减线程内核对象的使用计数。
参考(互斥对象内核对象)
ExitThread函数
可以让线程调用ExitThread函数,以便强制线程终止运行。
该函数将终止线程的运行,并导致操作系统清除该线程使用的所有操作系统资源。
但是,C++资源(如C++类对象,导致析构函数也没有被调用)将不被撤消。
TerminateThread函数
调用TerminateThread函数也能够终止线程的运行:
BOOL TerminateThread(
HANDLE hThread,
DWORD dwExitCode
);
与ExitThread不同,ExitThread总是撤消调用的线程,而TerminateThrea能够撤消任何线程。
hThread参数用于标识被终止运行的线程的句柄。当线程终止运行时,它的退出代码成为你作为dwExitCode参数传递的值。同时,线程的内核对象的使用计数也被递减。
注意 TerminateThread函数是异步运行的函数,也就是说,它告诉系统你想要线程终
止运行,但是,当函数返回时,不能保证线程被撤消。(见 互斥对象的释放问题)
在进程终止运行时撤消线程
ExitProcess和TerminateProcess函数也可以用来终止线程的运行。
差别在于这些线程将会使终止运行的进程中的所有线程全部终止运行。另外,由于整个进程已经被关闭,进程使用的所有资源肯定已被清除。这当然包括所有线程的堆栈。这两个函数会导致进程中的剩余线程被强制撤消,就像从每个剩余的线程调用TerminateThread一样。显然,这意味着正确的应用程序清除没有发生,即C ++对象撤消函数没有被调用,数据没有转至磁盘等等。
线程终止运行时发生的操作
* 线程拥有的所有用户对象均被释放。大多数对象进程拥有的。但是一个线程拥有两个用户对象,即窗口和挂钩。当线程终止运行时,系统会自动撤消任何窗口,并且卸载任何挂钩。其他对象只有在拥有线程的进程终止运行时才被撤消。
* 线程的退出代码从STILL_ACTIVE改为传递给ExitThread或Terminate Thread的代码。
* 线程内核对象的状态变为已通知。
* 如果线程是进程中最后一个活动线程,系统也将进程视为已经终止运行。
* 线程内核对象的使用计数递减1。
GetExitCodeThread检查由hThread标识的线程是否已经终止运行
BOOL GetExitCodeThread(
HANDLE hThread,
LPDWORD lpExitCode
);
本文地址:http://www.cnblogs.com/fangyukuan/archive/2010/09/01/1814393.html