【C/C++学习】之四种结束线程方式详解

一、四种方式

    1、线程自然return返回。

          如果线程能够返回,就可以确保下列事项的实现:
                 (1)在线程函数中创建的所有C++对象均将通过它们的析构函数正确地释放。
                 (2)操作系统将正确地释放线程堆栈使用的内存。
                 (3)系统将线程的退出代码(在线程的内核对象中维护)设置为线程函数的返回值。
                 (4)系统将递减线程内核对象的使用计数。

    2、调用 _endthreadex()函数或 ExitThread()函数。

    3、在同一个进程的另一个线程中调用 TerminateThread()函数。

    4、如果该线程位于某进程, 且该进程仅有这一个线程, 可直接结束进程以结束此线程。

     

二、安全性分析

        1、线程通过线程函数return返回而终止线程是最安全的, 当然我们设计也期望是这样结束线程。在线程函数return后会清理线程函数内申请的类对象, 即调用这些对象的析构函数(前提是栈上面的对象,手动new出来的对象依然需要自己去释放), 然后会自动调用 _endthreadex()函数来清理 _beginthreadex(…)函数申请的资源(主要是创建的tiddata对象)。

        2、如果使用_endthreadex()函数或 ExitThread()函数这两种方法退出线程, 则不会执行线程函数的return语句, 所以就不会调用线程函数作用域内申请的类对象的析构函数, 可能会造成内存泄露。

        3、同一进程中的另一线程调用TerminateThread()函数, 同样可能造成内存泄漏,而且由于该进程没有结束, 可能会多次创建结束线程, 造成严重的内存泄漏。

        4、通过结束进程去结束线程, 结果与上面类似。

三、总结

        并不是说所有线程都只能通过return返回, 只能说通过return结束线程,不会因为写程序的失误造成内存泄漏。如果在能确保释放内存的前提下, 也可以使用其他三种方式结束线程(谨慎使用)。

由于能力和经验限制,文章未能详尽和深入进行讲解。上述部分如有错误,欢迎指正和交流。

    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

醉逍遥_祥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值