终止运行线程

1. 线程函数返回。

2. 线程通过调用ExitThread函数“杀死”自己(避免使用)。

3. 同一个进程或另一个进程中的线程调用TerminateThread函数(避免使用)

4. 包含线程的进程终止运行(避免使用)

让线程函数返回,可以确保:

1. 线程函数中创建的所有C++对象都通过其析构函数被正确的销毁;

2. 操作系统正确释放线程栈使用的内存;

3. 操作系统把线程的退出代码设为线程函数的返回值;

4. 系统递减少线程的内核对象的使用计数。

使用ExitThread函数终止线程,并导致操作系统清理该线程使用的所有操作系统资源。但是,C++资源不会被回收。

不同于ExitThread总是“杀死”主调线程,TerminateThread能杀死任何线程,但是,线程无法正确清理,而且不能阻止自己被终止运行。详见《windows核心编程》P149。

ExitThread举例:

#include <iostream>
#include <windows.h>
#include <process.h>using namespace std;
unsigned int last_handle;unsigned int __stdcall lastFunc(PVOID pm) {cout << "hello world hello kitty" << endl;Sleep(2000);_endthreadex(last_handle);cout << "hello world" << endl;return 0;
}int main() {last_handle = _beginthreadex(NULL, 0, lastFunc, NULL, 0, NULL);Sleep(500);cout << "to be end..." << endl;getchar();return 0;
}

运行结果为:

线程函数 终止自己。

#include <iostream>
#include <windows.h>
#include <process.h>using namespace std;unsigned int last_handle;unsigned int __stdcall lastFunc(PVOID pm) {cout << "hello world hello kitty" << endl;Sleep(2000);cout << "hello world" << endl;return 0;
}int main() {last_handle = _beginthreadex(NULL, 0, lastFunc, NULL, 0, NULL);_endthreadex(last_handle);Sleep(500);cout << "to be end..." << endl;getchar();return 0;
}

运行结果如下:


 显示出运行窗口之后,窗口自动消失

在主线程中调用了_endthreadex(last_handle);  会保证该 last_handle 线程完成后, 主线程终止。

比较让人奇怪的是 传入的是子线程的句柄,子线程非但不终止 而且 主线程在等待子线程结束后,终止了自己。

即_endthreadex函数 只能在调用线程中终止自己。

终止运行线程的注意事项相关推荐

  1. Linux系统编程----15(线程与进程函数之间的对比,线程属性及其函数,线程属性控制流程,线程使用注意事项,线程库)

    对比 进程 线程 fork pthread_create exit (10) pthread_exit (void *) wait (int *) pthread_join (,void **)阻塞 ...

  2. 安全终止MFC线程全

    终止线程  有两种情况可以使线程结束:控制函数结束或者根本就不允许线程完成,而提前终止它.我们可以想象在WORD中进行后台打印,如果打印结束了,那线程就可以结束了.如果用户中止了打印,那后台打印线程也 ...

  3. python结束线程_2018-01-02 如何优雅地终止python线程

    前言 · 零 我们知道,在python里面要终止一个线程,常规的做法就是设置/检查 --->标志或者锁方式来实现的. 这种方式好不好呢? 应该是不大好的!因为在所有的程序语言里面,突然地终止一个 ...

  4. java gc时会暂停运行吗,java gc 项目终止运行

    当前位置:我的异常网» 编程 » java gc 项目终止运行 java gc 项目终止运行 www.myexceptions.net  网友分享于:2013-09-03  浏览:6次 java gc ...

  5. linux下c语言线程传参数,【linux】C语言多线程中运行线程池,在线程池中运行线程池,,传递的结构体参数值为空/NULL/0...

    C语言多线程中运行线程池,在线程池中运行线程池,,传递的结构体参数值为空/NULL/0 本贴问题,之前已经提问过一次,当时已经解决了,原贴在这里https://segmentfault.com/q/1 ...

  6. java 线程退出cmd_java 线程的终止与线程中断

    关于线程终止: 1.一般来讲线程在执行完毕后就会进入死亡状态,那该线程自然就终止了. 2.一些服务端的程序,可能在业务上需要,常驻系统.它本身是一个无穷的循环,用于提供服务.那对于这种线程我们该如何结 ...

  7. 如何终止Java线程

    Thread.stop,Thread.suspend,Thread.resume,Runtime.runFinalizersOnExit都已经被废弃了. 为什么要废弃Thread.stop?因为此函数 ...

  8. JDK中的Timer和TimerTask详解 目录结构: Timer和TimerTask 一个Timer调度的例子 如何终止Timer线程 关于cancle方式终止线程 反复执行一个任务 sche

    JDK中的Timer和TimerTask详解 目录结构: Timer和TimerTask 一个Timer调度的例子 如何终止Timer线程 关于cancle方式终止线程 反复执行一个任务 schedu ...

  9. Java终止当前线程的方法

    2019独角兽企业重金招聘Python工程师标准>>> 在系统开发中常常设计到多线程的使用,正常需求下开启线程不需要中途停止,特殊需求下需要停止当前线程(我当前的网页爬取系统中用到, ...

最新文章

  1. foo php,php – $foo === TRUE和TRUE === $foo有什么区别?
  2. 简单易懂的现代魔法——Play Framework攻略4
  3. 一个让我魂牵梦萦的地方——婺源
  4. MySQL浅谈 LEFT JOIN
  5. Ajax补充之serialize
  6. 金银花跟黄芪泡水有什么功效?
  7. Qt总结之十九:Qt中控件new之后需不需要delete的问题
  8. 欧几里得求最大公约数--JAVA递归实现
  9. GIS中的基本概念收集
  10. 并发编程学习之线程池工作原理
  11. Drools 规则引擎一文读懂
  12. mysql 全文索引 使用_MySql全文索引
  13. 淘宝内乱持续 QQ盛大京东“趁火打劫”
  14. qq 表情gif免费下载
  15. 辗转相除法 原理 Java实现
  16. 8s数据导入导出的load和unload解析
  17. 动态合批和静态合批的区别
  18. 注册表编辑器被改这样恢复
  19. 高一数学知识点复习:命题及其关系、充分条件
  20. CCF C³活动第二期主题“智能家居”,与CTO聚首小米科技园!

热门文章

  1. java中线程的状态以及线程栈分析
  2. Java对MongoDb的CURD操作
  3. 移动数据库 Realm 在 React-Native 的使用详解
  4. redis系列:redis介绍与安装
  5. sql order by 结合case when then
  6. Fatal error in launcher: Unable to create process using ''之解决办法
  7. MySQL字符集详解
  8. 第十二章: 部署Django
  9. Java学习——对象和类
  10. ListView高度