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

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

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

时间: 2024-08-26 08:15:58

C/C++四种退出线程的方法的相关文章

四种PS抠图的方法

四种PS抠图的方法          工具/原料 photoshop 软件(我用的是photoshop cc) 需要抠图的图片 开始的步骤 打开ps 打开图片,ctrl+O 下面是对不同的抠图的方法的介绍~ps抠图教程 魔棒抠图法 对于前景和后景有明显差别的图片用魔棒抠图法抠图比较容易,以阿狸为例,大家可以看到,这张图有着明显的白底~ 这个时候就用到了--魔棒工具 将魔棒工具在后景上点一下,就出现了一个选区,这个选区,是和图片的主要图案相吻合的 按一下delete键,白底就不见了,这样就被图片的

win8搜索不到蓝牙鼠标的四种原因和解决方法

  win8搜索不到蓝牙鼠标的四种原因和解决方法           解决方法一: 由于你是新系统的安装,首先第一个原因很有可能是没有安装蓝牙驱动.进入设备管理器中,查看蓝牙状态,看设备管理器中是否可以看到蓝牙设备.如果有黄色叹号就是驱动问题了. 解决方法二:Win8系统中有单独的蓝牙开关,你可以查看一下是否启用了飞行模式,是否关闭了蓝牙开关. 解决方法三:蓝牙服务启动项关闭导致的.有时候第三方安全软件优化开机启动项的时候会把蓝牙服务启动项关闭,蓝牙启动项为Bluetooth Support S

数据库系统中常见的四种故障及其解决方法

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 数据库系统中常见的四种故障主要有事务内部的故障.系统故障.介质故障以及计算机病毒故障,对应于每种故障都有不同的解决方法.事务故障表明事务没有提交或撤销就结束了,因此数据库可能处于不准确的状态. 一.常见的四种故障 (1)事务内部的故障:事务内部故障可分为预期的和非预期的,其中大部分的故障都是非预期的.预期的事务内部故障是指可以通过事务程序本身

四种JS遍历数组方法

<!doctype html public "-//w3c//dtd xhtml 1.0 transitional//en" "http://www.w3.org/tr/xhtml1/dtd/xhtml1-transitional.dtd"> <html xmlns="http://www.111cn.net/1999/xhtml"> <head> <meta http-equiv="conte

Android 中三种启用线程的方法总结

在多线程编程这块,我们经常要使用Handler(处理),Thread(线程)和Runnable这三个类,那么他们之间的关系你是否弄清楚了呢? 首先说明Android的CPU分配的最小单元是线程,Handler一般是在某个线程里创建的,因而Handler和Thread就是相互绑定的,一一对应. 而Runnable是一个接口,Thread是Runnable的子类.所以说,他俩都算一个进程. HandlerThread顾名思义就是可以处理消息循环的线程,他是一个拥有Looper的线程,可以处理消息循环

Android 四种获取屏幕宽度的方法总结

Android 四种获取屏幕宽度的方法 方法一: WindowManager wm = (WindowManager) this .getSystemService(Context.WINDOW_SERVICE); int width = wm.getDefaultDisplay().getWidth(); int height = wm.getDefaultDisplay().getHeight(); 方法二: WindowManager wm1 = this.getWindowManager

总结几种创建线程的方法

问题描述 //第一种:newThread(){publicvoidrun(){System.out.println("haha");}}.start();//第二种:newThread(newRunnable(){@Overridepublicvoidrun(){//TODOAuto-generatedmethodstubSystem.out.println("heihei");}}).start();//第三种:newTimer().schedule(newTim

四种神奇电脑开机方法

如果有人问你,你的电脑怎么开机?回答不外乎是:"直接按电脑机箱上的电源开关按钮不就得了".这当然是最简单的方法.不过,其实打开电脑还有许多方法,下面就给大家介绍四种神奇的电脑开机方法. 方法一:设置定时开机 主板上有实时时钟(Real Time Clock,RTC)负责系统的计时,我们可以通过RTC指定开机的时间,就像闹钟一样.不过,由于这项功能很少被人使用,部分虽然提供了此功能的主板(如INTEL原装主板)其实并不能在指定时间开机,所以用户在正式使用前最好先进行测试. 具体操作方式为

四种表单验证方法的分析和比较

前言 任何可以交互的站点都有输入表单,只要有可能,就应该对用户输入的数据进行验证.无论服务器后端是什么样的系统,都不愿意把时间浪费在一些无效的信息上,必须对表单数据进行校验,若有不符合规定的表单输入,应及时返回并给出相应的提示信息.本文将列举四种不同原理的表单验证方法,并给出各方法在 PHP 服务器上的实现. 浏览器端验证 传统上,表单数据一般都通过浏览器端的 Javascript 验证.浏览器端的验证速度快,若有不符合要求的输入,响应信息快速的返回给用户.由于验证数据不需要提交给服务器,不会加