CC++四种退出线程的⽅法
转载⾃:
退出线程可以有四种⽅法:
1.线程函数的return返回(最好这样):
其中⽤线程函数的return返回, ⽽终⽌线程是最安全的, 在线程函数return返回后, 会清理函数内申请的类对象, 即调⽤这些对象的析构函数. 然后会⾃动调⽤ _endthreadex()函数来清理 _beginthreadex(...)函数申请的资源(主要是创建的tiddata对象).
2.调⽤ _endthreadex()函数或 ExitThread()函数(最好不要):
析构方法 如果使⽤这两种⽅法退出线程, 则不会执⾏线程函数的return语句, 所以就不会调⽤线程函数作⽤域内申请的类对象的析构函数, 会造成内存泄露.
剩下两种是在程序设计中⼀定要避免的.
3.⽤同⼀个进程中的另⼀个线程调⽤ TerminateThread()函数(必须避免);
4.终⽌该线程所在的进程(绝对避免);
但是要说_endthreadex完全没有⽤肯定是不对的,_endthreadex并不是⼀个过时的函数,正确的使⽤并不会带来问题。
⽐如在线程的主函数中,return是_endthreadex的⼀个良好替代,就像main函数⾥⾯return是exit()或ExitProccess()的良好替代⼀样,但是这不表⽰exit函数没⽤。⽐如线程调⽤了⼀个⼦函数,如果⼦函数决定退出线程,return是没⽤的,_endthreadex即可终结线程。
但是这个设计不好,因为可能造成LZ提出的资源泄漏。尤其考虑到后台线程终结后的资源泄漏⽐主线程的资源泄漏更要命(主线程退出后,进程就退出了,OS会清理⼀切资源,⽆所谓泄露不泄露,⽽⼦线程退出后主线程可能还会运⾏很久,并且可能有⼤量的同类型的⼦线程退出,会造成要命的泄露)
良好的设计还是返回线程的主函数,让threadproc来决定是不是要退出,从这个意义上说,_endthreadex没有必要。微软也指出,有些程序员就是要调⽤exit系列函数(ExitThread,ExitProccess等),没辙,只好提供了。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论