线程的
线程的
CloseHandle()
在
但是这个
不执行
若在线程执行完之后,没有通过(应用程序运行时,有可能泄露内核对象,但是当进程终止运行时,系统能确保所有内容均被正确地清除。另外,这个情况是用于所有对象,资源和内存块,也就是说,当进程终止时,系统将保证不会留下任何对象。)
TerminateThread()
函数的声明如下:
BOOLTerminateThread(HANDLEhThread,DWORDdwExitCode);
作用:
在线程外终止一个线程,用于强制终止线程。
参数说明:
HANDLEhtread
DWORDdwExitCode:退出码。
返回值:
函数执行成功则返回非零值,执行失败返回
听过无数次不要TerminateThread,只是工作中常用,貌似也没有什么问题。今天在高强度测试中发现了一个不可原谅的错误。参看下面的例子
1.DWORD__stdcallmythread(void*)
2.{
3.while(true)
4.{
5.char*p=newchar[1024];
6.
7.delete[]p;
8.}
9.}
10.
11.int_tmain(intargc,_TCHAR*argv[])
12.{
13.
14.HANDLEh=CreateThread(NULL,0,mythread,NULL,0,NULL);
15.
16.Sleep(1000);
17.
18.TerminateThread(h,0);
19.h=NULL;
20.
21.
22.
23.delete[]p;
24.
25.return0;
26.}
为什么死锁呢?
<
另注:许多临时的网络操作经常用TerminateThread,作为网络不通时的退出机制,以后要改改了。比如让该线程自生自灭,自行退出。
ExitThread
若要终止线程的运行,可以使用下面四种的方法:线程函数退出循环来返回通过调用同一个进程或另一个进程中的线程调用该线程的主进程终止运行(避免使用)。下面将介绍终止线程运行的方法,并且说明线程终止运行时会出现什么情况。
1.线程函数返回始终都应该将线程设计成这样的形式,即当想要线程终止运行时,它们就能够返回。这是确保所有线程资源被正确地清除的唯一办法。如果线程能够返回,就可以确保下列事项的实现:a)b)操作系统将正确地释放线程堆栈使用的内存。c)系统将线程的退出代码(在线程的内核对象中维护)设置为线程函数的返回值。d)系统将递减线程内核对象的使用计数。
2.ExitThread函数可以让线程调用ExitThread函数,以便强制线程终止运行:该函数将终止线程的运行,并导致操作系统清除该线程使用的所有操作系统资源。但是,当然,可以使用注意终止线程运行的最佳方法是让它的线程函数返回。但是,如果使用本节介绍的方法,,应该知道
3.TerminateThread函数调用TerminateThread函数也能够终止线程的运行:与注意设计良好的应用程序从来不使用这个函数,因为被终止运行的线程收不到它被撤消的通知。线程不能正确地清除,并且不能防止自己被撤消。注意当使用返回或调用
4.在进程终止运行时撤消线程ExitProcess
竞争颇似打网球,与球艺胜过你的对手比赛,