提供一个“多线程(或进程)同时退出时判断是哪些线程退出”的方法
2016-11-09 12:08
393 查看
在写多线程的时候,我们常常会有这样的苦恼:
1、WaitForMultipleObjects()这个函数在等待多个对象返回时,返回的总是最小的那个线程,但是我们很想知道到底是哪些线程退出了,可以依据退出的线程由主线程来针对地做一些处理。
2、WaitForMultipleObjects()等待的多个线程中,线程都处理不同的事务,并且运行的时间都不确定,有可能同时,有可能不同时,那我要怎么确定是哪个线程退出?
不多说其它东西,示例代码如下所示:
上述示例代码的结果:
由于提供的只是一种方法,所以示例代码比较精简,你可以使用用于其它应用场景。如有问题或者一些改进意见,麻烦请评论或者私信联系我,谢谢大家。
该示例的git地址:https://github.com/meloyi/MeloThreads/tree/master
示例的CSDN下载地址:http://download.csdn.net/detail/meloyi/9677397
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
相关文章推荐
- [c/c++] 一个进程有多个线程,用什么方法让主线程不退出更好,占用资源最少,效率最高?
- 多线程之join()方法---(Thread提供的让一个线程等待另一个线程完成的方法)
- [c/c++] 一个进程有多个线程,用什么方法让主线程不退出更好,要求占用资源最少,效率最高
- 判断VC 6.0装了哪些补丁的一个简单方法
- windows多线程编程-----1.四个线程同时输出//一个文件( 没有参数+有参数 )
- [Java 09 多线程] 线程是指一个进程在执行过程中可以产生更小的程序单元
- 设计一个多线程程序如下:设计一个火车售票模拟程序。假如火车站要有100张火车票要卖出,现在有5个售票点同时售票,用5个线程模拟这5个售票点的售票情况(提示:利用多线程)
- 判断VC 6.0装了哪些补丁的一个简单方法
- 多线程 判断bool变量,设定时一定要lock一个方法
- singleton pattern的一个模板实现, 适用于单线程, 并且提供了Release方法
- 重新想象 Windows 8 Store Apps (42) - 多线程之线程池: 延迟执行, 周期执行, 在线程池中找一个线程去执行指定的方法
- 多线程关闭窗体时所有线程都退出的方法
- 重新想象 Windows 8 Store Apps (42) - 多线程之线程池: 延迟执行, 周期执行, 在线程池中找一个线程去执行指定的方法
- java中,多个线程同时调用同一个静态方法的问题
- 一个方法最多2个线程同时使用的JAVA实现
- 黑马程序员_学习日记65_713ASP.NET(委托、托管、扩展方法、泛型委托、进程_应用程序域_线程、多线程、异步委托)
- [shell]判断一个字符串是否为数字字符串的两种方法(是否为进程号(PID))
- 判断一个线程是否执行结束以及获取线程退出码
- Linux下多个进程或线程同时对一个文件进行写操作
- 多线程用同一个dao对象就会存在多个线程执行同一方法,为什么不用考虑线程安全问题