终止运行线程的注意事项
终止运行线程
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函数 只能在调用线程中终止自己。
终止运行线程的注意事项相关推荐
- Linux系统编程----15(线程与进程函数之间的对比,线程属性及其函数,线程属性控制流程,线程使用注意事项,线程库)
对比 进程 线程 fork pthread_create exit (10) pthread_exit (void *) wait (int *) pthread_join (,void **)阻塞 ...
- 安全终止MFC线程全
终止线程 有两种情况可以使线程结束:控制函数结束或者根本就不允许线程完成,而提前终止它.我们可以想象在WORD中进行后台打印,如果打印结束了,那线程就可以结束了.如果用户中止了打印,那后台打印线程也 ...
- python结束线程_2018-01-02 如何优雅地终止python线程
前言 · 零 我们知道,在python里面要终止一个线程,常规的做法就是设置/检查 --->标志或者锁方式来实现的. 这种方式好不好呢? 应该是不大好的!因为在所有的程序语言里面,突然地终止一个 ...
- java gc时会暂停运行吗,java gc 项目终止运行
当前位置:我的异常网» 编程 » java gc 项目终止运行 java gc 项目终止运行 www.myexceptions.net 网友分享于:2013-09-03 浏览:6次 java gc ...
- linux下c语言线程传参数,【linux】C语言多线程中运行线程池,在线程池中运行线程池,,传递的结构体参数值为空/NULL/0...
C语言多线程中运行线程池,在线程池中运行线程池,,传递的结构体参数值为空/NULL/0 本贴问题,之前已经提问过一次,当时已经解决了,原贴在这里https://segmentfault.com/q/1 ...
- java 线程退出cmd_java 线程的终止与线程中断
关于线程终止: 1.一般来讲线程在执行完毕后就会进入死亡状态,那该线程自然就终止了. 2.一些服务端的程序,可能在业务上需要,常驻系统.它本身是一个无穷的循环,用于提供服务.那对于这种线程我们该如何结 ...
- 如何终止Java线程
Thread.stop,Thread.suspend,Thread.resume,Runtime.runFinalizersOnExit都已经被废弃了. 为什么要废弃Thread.stop?因为此函数 ...
- JDK中的Timer和TimerTask详解 目录结构: Timer和TimerTask 一个Timer调度的例子 如何终止Timer线程 关于cancle方式终止线程 反复执行一个任务 sche
JDK中的Timer和TimerTask详解 目录结构: Timer和TimerTask 一个Timer调度的例子 如何终止Timer线程 关于cancle方式终止线程 反复执行一个任务 schedu ...
- Java终止当前线程的方法
2019独角兽企业重金招聘Python工程师标准>>> 在系统开发中常常设计到多线程的使用,正常需求下开启线程不需要中途停止,特殊需求下需要停止当前线程(我当前的网页爬取系统中用到, ...
最新文章
- foo php,php – $foo === TRUE和TRUE === $foo有什么区别?
- 简单易懂的现代魔法——Play Framework攻略4
- 一个让我魂牵梦萦的地方——婺源
- MySQL浅谈 LEFT JOIN
- Ajax补充之serialize
- 金银花跟黄芪泡水有什么功效?
- Qt总结之十九:Qt中控件new之后需不需要delete的问题
- 欧几里得求最大公约数--JAVA递归实现
- GIS中的基本概念收集
- 并发编程学习之线程池工作原理
- Drools 规则引擎一文读懂
- mysql 全文索引 使用_MySql全文索引
- 淘宝内乱持续 QQ盛大京东“趁火打劫”
- qq 表情gif免费下载
- 辗转相除法 原理 Java实现
- 8s数据导入导出的load和unload解析
- 动态合批和静态合批的区别
- 注册表编辑器被改这样恢复
- 高一数学知识点复习:命题及其关系、充分条件
- CCF C³活动第二期主题“智能家居”,与CTO聚首小米科技园!