如何终止一个正在运行的线程:
强制终止线程就一个原则,最好让线程自己结束,即线程return;
1.用TerminateThread()
BOOL TerminateThread(
HANDLE hThread,
DWORD dwExitCode
);
书中解释:TerminateThread() 看 起 来 不 错 , 直 到 我 读 了 一 份 文 件 , 上 面 说 :
“ TerminateThread() 是一个危险的函数, 应该在最不得已的情况下才使用”。
这是一个非常明白的警告。
TerminateThread() 强迫其行动目标(一个线程)结束,手段激烈而有力,
甚至不允许该线程有任何“挣扎”的机会。这带来的副作用便是,线程没有机
会在结束前清理自己。对线程而言,这可能导致前功尽弃。这个函数不会在目
标线程中丢出一个异常情况( exception),目标线程在核心层面就被根本抹杀
了。目标线程没有机会捕捉所谓的“结束请求”,并从而获得清理自己的机会。
还有另一个令人不愉快的情况。目标线程的堆栈没有被释放掉,于是可能
会引起一大块内存泄漏( memory leak)。而且,任何一个与此线程有附着关系
的 DLLs 也都没有机会获得“线程解除附着”的通知。
此函数唯一可以预期并依恃的是,线程 handle 将变成激发状态(译注:
因为线程结束了),并且传回 dw ExitCode 所指定的结束代码。
这个函数所带来的隐伏危机还包括: 如果线程正进入一个 critical section
之中,该 c