当前位置:  编程技术>c/c++/嵌入式

C/C++中退出线程的四种解决方法

    来源: 互联网  发布时间:2014-10-17

    本文导语:  退出线程可以有四种方法: 1.线程函数的return返回(最好这样):其中用线程函数的return返回, 而终止线程是最安全的, 在线程函数return返回后, 会清理函数内申请的类对象, 即调用这些对象的析构函数. 然后会自动调用 _endthreadex()函...

退出线程可以有四种方法:

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等),没辙,只好提供了。


    
 
 

您可能感兴趣的文章:

  • 请问:进程创建的线程是怎样运行的啊,线程的处理函数运行完了,线程就退出了吗?
  • main函数在线程执行完毕之前退出, 线程的哪些资源会被清理?
  • 线程运行问题 线程跑了一段时间 然后直接退出 急!急!急!急!
  • 大家好,pthread库创建线程,如何等待线程安全退出?
  • 进程先于线程退出
  • 如何在一个线程中启动另外一个线程,然后本线程就退出?
  • 如何在kthread_create创建的线程函数里面退出该线程呢????
  • 如何等待线程干净退出?
  • 如果两个线程操作同一个Socket,一个线程recv,另一个send。这样会不会导致程序莫名其妙的退出
  • 线程退出问题
  • 使用信号量如何退出线程?
  • 请教:pthread_join( )在等待一个已经退出的线程时为何会导致死锁?
  • pthread_cancel线程退出问题 while(1)这种循环如何退出?急!急 !
  • linux下如何实现线程的启动,暂停,和退出!
  • 什么样的语句可以使多线程程序直接退出。
  • 线程退出的问题。
  • 请问调用notify后被选中线程的wait是立刻返回,还是等到调用notify的线程退出synchronized块后再返回?
  • 先pthread_cancel()再pthread_join(),主线程退出?
  • GDB调试线程,退出时老是出现异常
  • sigwaitinfo线程为何退出???
  • C# WinForm程序完全退出的问题解决
  • 如何解决程序自己调用自已后结束进程,并且父进程能真的退出不成为僵尸进程?
  • 在Redhat中放一张光盘在光驱中后,就弹不出来了,必须退出系统才行,怎么解决啊?
  • 在Redhat 7.2中,从XWindows退出后,按Ctr+Alt+Del重起后,root密码失效,怎么解决!
  • 移动开发 iis7站长之家
  • Android程序退出完美解决方案兼容所有SDK
  • 从定时从A程序调用B程序(B程序运行一下就退出)多次后,出现僵尸进程?如何解决?
  • 我想在WINXP下使用LINUX可又不想退出WINXP,我的机子没光驱和软驱,就不能用虚拟机+光盘起动的方法解决,有什么办法啊
  • 如何设定“确定”和“取消”按钮的退出属性?(昨日未解决,今日重问)在线等待
  • 为什么程序不能退出?解决就马上给分。
  • [ 高手进来研究一下 ] malloc() 失败,并系统调用abort() 从而使程序退出,如何解决?
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 各位大虾,vi怎么进入命令模式,并且保存退出/不保存退出?急死我了
  • shell 函数中的用exit时,什么情况下仅仅退出函数,什么情况下退出整个shell程序?
  • 终端打开应用程序,怎样使当终端退出时应用程序不退出.问了好多人,其实很简单.
  • 请问:我发现send函数会使客户端退出, 这怎么办啊,怎样让它不使客户端退出啊,这样我就能重新连上了啊?
  • 如何退出 PDOS95 ? (PDOS95--进入Windows98--退出PDOS95)
  • 段错误为什么程序会退出?谁让退出的?
  • 请问如何通过telnet的方式启动服务器(solaris)上的用.sh角本方式启动java写的应用程序,在退出telnet时服务器上的应用程序不会退出?
  • 父进程等待子进程n秒,如果子进程正常退出,父进程立即继续向下执行,如果子出现进程故障一直不退出,父进程等待n秒后继续向下执行,请问
  • 后台运行程序异常退出
  • 怎样从X windows 退出
  • 进程退出码大于129代表什么意思?
  • vi的退出
  • 关于精灵进程退出的问题
  • 关于父,子,孙进程的创建和退出问题?????(用system v信号量集)
  • java中怎样退出 for 循环?
  • man 命令如何退出?
  • 怎样让awk输出到中途退出awk?
  • linux命令如何实现重启父进程而不会使其子进程退出
  • 输入VI ,MAN等命令后,如何退出到终端?
  • 进程定时退出的问题


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3