(子)线程在正常return后,线程句柄是否还有效?

dimscsdnaccount 2016-06-25 04:43:07
如题,我让已创建的80个子线程在检测到对应的外部值为-1时break跳出循环然后return 0;我很确定所有线程已经return了,并在主线程上Sleeo(1000)给了足够的时间让子线程执行完最后一次并return。
1.句柄值会自动变为无效值还是别的值?
2.我还需要CloseHandle将所有句柄关闭吗?
说明:
编译环境VS2013 ,编写MFC基本对话框
创建线程的方式是 Handle h=CreateThread(...);
在等待10s确定子线程结束后 关闭句柄
if (hPO[i] != INVALID_HANDLE_VALUE) {
CloseHandle(hPO[i]); //在这里出错①
hPO[i] = INVALID_HANDLE_VALUE;
}
①出错为An invalid handle was specified 。
...全文
2047 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
Saleayas 2016-10-31
  • 打赏
  • 举报
回复
线程的句柄无效值是 0,不是 -1. 你比较错了。
BeanJoy 2016-10-31
  • 打赏
  • 举报
回复
主线程不必等待10秒,可以创建完就直接CloseHandle。 另外,CreateThread失败返回的是NULL,不是INVALID_HANDLE_VALUE,CreateFile失败返回的才是INVALID_HANDLE_VALUE。 最好精简你的代码,帖上代码更好分析问题。
Eleven 2016-10-28
  • 打赏
  • 举报
回复
这个线程句柄是个内核对象,只要你不主动关闭,或者程序没有退出引用计数没有变为0,系统没有销毁它,它就会一直有效的。
imagebreaker 2016-10-28
  • 打赏
  • 举报
回复
楼主, 通俗点说, 就是你这个线程还在的. 通常若在线程启动后不希望主线程再干涉工作线程, 那么CreateThread后可以立即使用CloseHandle将线程句柄关闭, 如此线程在正常退出(return)的情况下才能够正确释放资源, 否则句柄资源是不会释放的, 直到你调用CloseHandle为止.
太上绝情 2016-08-18
  • 打赏
  • 举报
回复
有效,必须手动closehandle
赵4老师 2016-08-18
  • 打赏
  • 举报
回复
《Windows核心编程》
牧童吃五谷 2016-06-29
  • 打赏
  • 举报
回复
好像这个句柄可以使用一段时间的,但在线程关闭后只能用一小段时间
zgl7903 2016-06-26
  • 打赏
  • 举报
回复
Create 之后 把句柄Trace出来 CloseHandle 之前也Trace出来 对比下 越界操作不单可能是数组本身, 其它地方的越界(如 数组写、memset memcpy strcpy 等)都有可能
dimscsdnaccount 2016-06-25
  • 打赏
  • 举报
回复
引用 1 楼 zgl7903 的回复:
线程退出后 句柄不会变 需要关闭句柄 被越界修改的可能性很大
你是说我设置的句柄数组可能越界操作了吗?我回去仔细查看了下不可能越界,我用for int i = 0开始,到最大线程数结束,下标是不会越界的;而且调试运行时第一次就出错了,跳过后每次还是出错,说明每个都出错了。·
zgl7903 2016-06-25
  • 打赏
  • 举报
回复
线程退出后 句柄不会变 需要关闭句柄 被越界修改的可能性很大

15,466

社区成员

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

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