提供一个“多线程(或进程)同时退出时判断是哪些线程退出”的方法

来源:互联网 发布:数据分析师等级考试 编辑:程序博客网 时间: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
原创粉丝点击