C语言-windows下进程与线程终结

进程终结:

      exit(退出码)


线程终结:

windows操作系统中,创建的线程有以下4种终止方式

1. 线程函数返回

当线程函数返回时,该线程会被终止,始终应该采用该方式来结束线程的运行,因为这是确保所有线程资源被正确清除的唯一办法。如果线程按照该方式成功返回,则:

1)线程函数中创建的所有C++对象均能通过他们的析构函数正确的被撤销

2)操作系统将正确的释放线程运行栈所使用的内存

3)系统将线程的退出代码(在线程的内核对象中维护)设置为线程函数的返回值

4)系统将该线程内核对象的使用计数递减

2.ExitThread函数

可以调用该函数,强制终止线程的运行。该函数将导致操作系统清除该线程所使用的所有操作系统资源。但是,C++资源(如类对象)将不被撤销。该方法通常是windows用来撤销线程的函数。因此,最好采用方法1来退出线程,而不是通过调用该函数来返回。

3.TerminateThread函数

调用该函数也能终止线程的运行,但与ExitThread函数不同,后者总是撤销调用的线程,而前者能够撤销任何线程。TerminateThread是异步运行的函数,也就是说,它告诉系统你想要线程终止运行,但是,该函数返回时,不能保证线程被撤销。如果需要确切地知道该线程已经终止运行,必须调用WaitForSingleObject或类似函数。当使用方法1和方法2撤销线程时,该线程的内存栈空间也被撤销。而如果使用TerminateThread,那么在拥有该线程的进程终止运行之前,系统不撤销该线程的运行栈。

4.进程终止运行时终止线程

在进程终止运行时,该进程中的所有线程全部终止运行,由于整个进程已经被关闭,进程所使用的所有资源肯定已被清除。这当然包括所有线程的栈空间。使用ExitProcess和TerminateProcess函数,会导致进程中的剩余线程被强制撤销,就像从每个剩余的线程调用TerminataProcess一样,因此,这也意味着正确的应用程序清除没有发生,即C++对象析构函数没被调用,数据没有转移至磁盘等等。

总结以上4种方法,通常,我们应当始终采用第一种方法来终止线程的运行。

我们可以在主线程将要退出时,给子线程发消息,或者别的方式,告诉子线程,让子线程自动退出。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值