父线程结束时如何自动结束子线程

        首先要指出这里的父线程不是主线程 这的确是个问题,也就是说怎么才能保证父线程结束后其子线程也都退出.有人说在父线程结束前结束掉子线程不就行了吗?但事实是,如何父线程被暴力时,根本无法正确处理子线程.个人认为有两种方法.

        一是在父线程中得到句柄,创建子线程时作为参数传给子线程,这样子线程通过这个句柄可以知道父线程是否仍存活,如何已结束,则结束自身.

       父线程中:

HANDLE hParent=INVALID_HANDLE_VALUE;
if (!DuplicateHandle (GetCurrentProcess (),GetCurrentThread (),GetCurrentProcess (),&hParent,NULL,TRUE,DUPLICATE_SAME_ACCESS))
   printf ("get parent handle failed!/n");

CreateThread (&sa,0,thread_fun2,(LPVOID)hParent,NULL,NULL);

子线程中:

HANDLE hParent=(HANDLE)lpParam;
DWORD nCode;
do
{
   if (!GetExitCodeThread (hParent,&nCode))
   {
    printf ("get exit code failed!/n");
    printf ("error:%d/n",GetLastError ());
   }
   if (nCode!=STILL_ACTIVE)//父线程结束
    return 1;
   ....
}while (....);

         注意DuplicateHandle的参数,开始我图省事将最后一个参数也设为NULL,结果在子线程中调用GetExitCodeThread时会出错,通过错误代码知道是"拒绝访问",也即没有足够权限,因此在得到父线程实句柄时一定要指定访问权限.

        第一种其实有点应付的味道,性能不好,而且并不能算是完成了要求,当然以实时性要求不高时也可以.另一种方法是通过一个全局数组,或者一个创建父线程时作为参数传入的数组存储所有建立的子线程句柄.这样当要结束父线程时,就可以根据这个数组将所有记录的子线程结束.有点浪费空间,不过性能肯定比第一种好,而且实时性也要好得多.

 
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值