反复创建线程,句柄数未被释放

liruiu2u 2018-04-25 09:44:30
今天写了一个小的测试程序,主进程启动一个子线程A,再由这个A子线程启动一定数量的B子线程进行测试工作。B子线程完成测试工作正常结束返回,这个过程中A和B都没有强制结束线程的操作。子线程A循环检查子线程B的状态,等所有B子线程结束返回后,再进行一定的初始化工作,并重新创建B子线程进行测试工作。
目前遇到一个情况,随着子线程B的创建,在任务管理器中发现句柄数在不停的增加。可以排除子线程B内函数的影响,因为将B子线程的函数里面的语句全部注释掉了,只做一件事return true,占用的句柄数仍在增加。
下面是子线程A中创建和判断子线程B的关键语句,请大神们帮忙看看哪里不对,导致了句柄数不停的增加。


//以下开始创建B子线程和检查B子线程是否结束
LB_STARTTEST;

for (i=0;i<pInfo->m_iThreadNum;i++)
{ // 启动指定数量的子进程

CMyPublicData::thread_vector.push_back(AfxBeginThread(HighCardRandomTest::RandomTestChild,
pInfo,THREAD_PRIORITY_NORMAL,0,CREATE_SUSPENDED,0));


CMyPublicData::thread_vector[i]->m_bAutoDelete=FALSE;//为了能检查B线程状态,不让系统自动清理回收资源

CMyPublicData::thread_vector[i]->ResumeThread();


}

::SendMessage(pInfo->hWnd,WM_INFO_RanTest,0,2);

LB_CHECKTHREADSTAT:

for (i=0;i<pInfo->m_iThreadNum;i++)
{

ref=GetExitCodeThread(CMyPublicData::thread_vector[i]->m_hThread,&dwExitCode);

if (dwExitCode==STILL_ACTIVE)
{
goto LB_CHECKTHREADSTAT;
}

}


for (i=0;i<pInfo->m_iThreadNum;i++)
{
//清理B子线程资源 以下各种都试过了,句柄数仍然不停增加,未得到释放
//CloseHandle(CMyPublicData::thread_vector[i]);
//CMyPublicData::thread_vector[i]->m_hThread=NULL;
//CMyPublicData::thread_vector[i]->Delete();

delete CMyPublicData::thread_vector[i];
CMyPublicData::thread_vector[i]=NULL;


}

if (CMyPublicData::b_isStop==TRUE)
{
CMyPublicData::thread_vector.clear();


::SendMessage(pInfo->hWnd,WM_INFO_RanTest,0,1);
return TRUE;
}
j++;
TRACE("\r\n****************已测试轮数%d\r\n",j);
goto LB_STARTTEST;
return TRUE;
...全文
1992 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
Marcelxx 2018-04-28
  • 打赏
  • 举报
回复
CloseHandle
liruiu2u 2018-04-28
  • 打赏
  • 举报
回复
虽然句柄数还是在不停增加,但是中间增加一句hThread = NULL delete确实不报错了,目前拷机中,句柄数已经1600W了,程序还没蹦。等到过完节再去看最后的结果
赵4老师 2018-04-26
  • 打赏
  • 举报
回复
《Windows核心编程》
zgl7903 2018-04-26
  • 打赏
  • 举报
回复
CloseHandle(hThread); hThread = NULL; delete ……
liruiu2u 2018-04-26
  • 打赏
  • 举报
回复
调试的输出窗口,可以看到线程的返回值。可以确定B线程已经返回了
liruiu2u 2018-04-26
  • 打赏
  • 举报
回复
win7系统自带的任务管理器,选择列里面有个句柄数,这个里面看着句柄数一直增加。问题的关键是不能先调用Closehandle,后调用delete一定会报错
worldy 2018-04-26
  • 打赏
  • 举报
回复
在VS的调出调试菜单--窗口---线程的窗口,检查你的B线程情况是否有结束
worldy 2018-04-26
  • 打赏
  • 举报
回复
引用 2 楼 liruiu2u 的回复:
试过了,在delete之前关闭句柄,运行会在delete那一句报错“An invalid handle was specified”。
说明你的线程已经结束,已经无效。你的 “句柄数仍然不停增加,未得到释放” 是通过什么观察到的?
liruiu2u 2018-04-26
  • 打赏
  • 举报
回复
试过了,在delete之前关闭句柄,运行会在delete那一句报错“An invalid handle was specified”。
zgl7903 2018-04-26
  • 打赏
  • 举报
回复
delete删除之前 CloseHandle CloseHandle(hThread); delete ……
smwhotjay 2018-04-26
  • 打赏
  • 举报
回复
《Windows核心编程》

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧