提供一个“多线程(或进程)同时退出时判断是哪些线程退出”的方法
来源:互联网 发布:数据分析师等级考试 编辑:程序博客网 时间:2024/05/01 18:46
在写多线程的时候,我们常常会有这样的苦恼:
1、WaitForMultipleObjects()这个函数在等待多个对象返回时,返回的总是最小的那个线程,但是我们很想知道到底是哪些线程退出了,可以依据退出的线程由主线程来针对地做一些处理。
2、WaitForMultipleObjects()等待的多个线程中,线程都处理不同的事务,并且运行的时间都不确定,有可能同时,有可能不同时,那我要怎么确定是哪个线程退出?
不多说其它东西,示例代码如下所示:
// MeloThreads.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include <windows.h>//设定最大的运行数量#define IMAX 10//这个结构体可以用于描述线程的其他信息typedef struct _myThread { int iTid; HANDLE hHandle; _myThread() { iTid = 0; hHandle = NULL; }}MYTHREAD;DWORD WINAPI ThreadWork(LPVOID lpParam);int _tmain(int argc, _TCHAR* argv[]){ int i = 0; int iTotal = 0; MYTHREAD MyThread[IMAX]; HANDLE nThread[IMAX]; HANDLE hTmp; //在这里创建线程和进程都无所谓 //不过在这里是线程 for(i=0; i<IMAX; i++) { //有可能创建线程失败,失败就不记录数量 if( hTmp = CreateThread(NULL, 0, ThreadWork, NULL, 0, NULL) ) { nThread[iTotal] = hTmp; MyThread[iTotal].hHandle = hTmp; MyThread[iTotal].iTid = iTotal; iTotal++; } } //用于记录是那个对象是返回的 int iIndex; //循环等待所有线程退出 while (iTotal) { //等待线程退出 //第一个参数:表示等待的线程数量,当有线程退出之后会减1 //第二个参数:线程的句柄队列 //第三个参数:表示只要有一个线程退出就返回 //第四个参数:线程的超时时间 iIndex = ::WaitForMultipleObjects(iTotal, nThread, false, INFINITE); iIndex = iIndex - WAIT_OBJECT_0; //只要不是返回-1(出错) if(-1 != iIndex) { //这里找出是哪个线程退出了,退出了则去掉这个进程的信息 for(int i=0; i<IMAX; i++) { if ( MyThread[i].hHandle == nThread[iIndex] ) { printf("线程:%d 退出!\n", MyThread[i].iTid); MyThread[i].iTid = 0; MyThread[i].hHandle = NULL; break; } } //这里如果不closehandle,那么等待的句柄队列就会包含一个无效句柄 //那么函数WaitForMultipleObjects()就会返回-1 CloseHandle(nThread[iIndex]); nThread[iIndex] = NULL; //关闭句柄之后将已经退出的句柄从队列中删掉,否则就会一直触发这个对象 //然后将之后有效的句柄往前移,保证队列中所有的句柄都是有效的 //最后等待的句柄数量减1 for(int i=0; i<iTotal; i++) { if (i > iIndex) { nThread[i-1] = nThread[i]; } } nThread[--iTotal] = NULL; } } return 0;}//线程的功能是数30秒后退出DWORD WINAPI ThreadWork(LPVOID lpParam){ for (int i=0; i<30; i++) { Sleep(1000); } return 0;}
上述示例代码的结果:
由于提供的只是一种方法,所以示例代码比较精简,你可以使用用于其它应用场景。如有问题或者一些改进意见,麻烦请评论或者私信联系我,谢谢大家。
该示例的git地址:https://github.com/meloyi/MeloThreads/tree/master
示例的CSDN下载地址:http://download.csdn.net/detail/meloyi/9677397
0 0
- 提供一个“多线程(或进程)同时退出时判断是哪些线程退出”的方法
- 多线程关闭窗体时所有线程都退出的方法
- android判断进程是否是意外退出
- Swing程序退出时同时关闭进程!!
- C# WinForm 多线程 应用程序退出的方法 结束子线程
- 【多线程-Abort()方法强制退出线程】
- 杀死或退出进程
- 保证线程退出的方法
- VC退出线程的方法
- MFC 线程的退出方法
- 线程安装退出的方法
- 【线程退出】:VC线程安全退出的方法
- [java多线程]如何安全的退出线程
- 判断 & 是否随着用户退出 进程退出
- 退出App前的一个判断
- 两次返回退出进程同时杀死进程
- 安全退出线程方法
- Android退出APP时如何同时结束APP进程
- 图像处理-离散傅里叶变换-数字图像处理第三版第四章内容
- 【微信小程序常见问题】view标签设置背景图片手机无法预览解决方案一
- 如何使用私有网络部署全球同服游戏服务
- MySQL小技巧(追加中)
- linux下vi命令修改文件及保存的使用方法
- 提供一个“多线程(或进程)同时退出时判断是哪些线程退出”的方法
- 12.1简介Object类
- 基于用户画像大数据的电商防刷架构
- C++中继承总结
- 存储过程详解
- 图像分割的性能测试指标小结
- 小白配置使用freeline入门
- MySQL内核深度优化
- 腾讯云从零部署nodejs站点