TC官方合作论坛

标题: 线程里使用返回,等同于线程,关闭(),那资源是否也释放了呢 [打印本页]

作者: aimei_8866999    时间: 2014-12-20 21:22
标题: 线程里使用返回,等同于线程,关闭(),那资源是否也释放了呢
本帖最后由 aimei_8866999 于 2014-12-20 23:19 编辑

比方说我们开启一个线程,,得到一个返回值就是线程句柄,当我们在线程执行中间来关闭它,就需要用,线程.关闭()这个命令,如果关闭了就要释放下线程的资源,这个时候我们就用,线程.关闭句柄(),官方的解释是,清理内核对象,释放资源
但是如果我们在线程结束或者中间 添加了 返回 命令 ,那还要 使用
线程.关闭句柄() 来释放资源吗
TC帮助文档上面介绍的
关闭句柄(句柄)
closehandle(handle)
百度了 一下这个函数 下面是百度介绍


作者: jianming319    时间: 2014-12-20 22:49
要   
作者: 梁夜    时间: 2014-12-20 22:57
我也是醉了  好深奥的样子啊 线程关闭之后 应该是自动会销毁线程的资源  返回就不知道了  应该效果是一样的 线程调用函数返回 就是线程结束了 ,线程句柄也无效了
作者: aimei_8866999    时间: 2014-12-20 23:53
梁夜 发表于 2014-12-20 22:57
我也是醉了  好深奥的样子啊 线程关闭之后 应该是自动会销毁线程的资源  返回就不知道了  应该效果是一样的 ...

你百度下吧 上面不是这么说的 线程句柄是系统内核资源,线程执行完之后并没有返还,还有貌似就是 线程句柄资源系统是有限制的,如果一直不返还,一直增加,就会出错
作者: aimei_8866999    时间: 2014-12-21 00:24
好吧 还是百度强大 问题现在基本明了
请看百度上说的
CloseHandle到底做了什么?

当调用CloseHandle成功后,相关的内核对象的引用计数被减1。

这个函数做的工作就这么多。它并没有真正的关闭内核对象,只是将计数减1,也就是说,这个时候,如果这个内核对象的引用计数不为0的话,内核对象依然存在,如果你有办法找到他,那么你依然可以操作他。

一个比较常见的问题:

CreateThread后立即CloseHandle,为什么线程还在运行?

可以这样认为,CreateThread之后,线程的内核对象的引用计数为2,CloseHandle之后,如果线程还没有结束,那么他的引用计数是1,不是0,此时,系统不会回收内核对象,所以线程还在执行。直到线程执行结束,引用计数变成了0,此时,系统回收。


内核对象什么时候被删除?

以下两种情况,内核对象会被删除--系统回收:

    当内核对象的引用计数为0的时候
    进程结束后

如果内核对象的引用计数不为0,但是相关的进程都已经结束了,那么该内核对象会被系统回收。
参考:
进程确实没有机会执行自己的清除操作,但是操作系统可以在进程之后进行全面的清除,使得所有操作系统资源都不会保留下来。这意味着进程使用的所有内存均被释放,所有打开的文件全部关闭,所有内核对象的使用计数均被递减,同时所有的用户对象和GDI对象均被撤消。
       ----摘自Windows核心编程 第四版 4.3.3


内核对象泄露

内核对象在使用完毕之后,没有及时调用CloseHandle关闭,在该进程运行期间,将造成内核对象泄露。

内核对象泄露会对系统造成一定程度的负面影响,但进程结束退出后,操作系统会自动回收这些内核对象。
////以上是百度到的//////////////////////////////////////////////////////////////////////////////////////////////
现在我根据上面说的,理解成 启动一个线程,可以立即关闭线程句柄,这不影响线程的运行,以及中间对他的操作
比方说挂起,关闭

作者: q273814    时间: 2014-12-21 17:36
使用返回 你的意思里就是代码执行完毕了 这里应该是自动释放了的
作者: aimei_8866999    时间: 2014-12-21 20:41
q273814 发表于 2014-12-21 17:36
使用返回 你的意思里就是代码执行完毕了 这里应该是自动释放了的

现在我只要开启线程,立即关闭句柄,目前测试不稳定,很容易崩溃,特别在 初始化那里的线程 不能开启了立即关闭句柄,这有点头大了
作者: q273814    时间: 2014-12-22 18:25
aimei_8866999 发表于 2014-12-21 20:41
现在我只要开启线程,立即关闭句柄,目前测试不稳定,很容易崩溃,特别在 初始化那里的线程 不能开启了立即关 ...

关闭那一句 判断下线程状态 在运行才关闭
作者: aimei_8866999    时间: 2014-12-23 00:49
q273814 发表于 2014-12-22 18:25
关闭那一句 判断下线程状态 在运行才关闭

判断了
作者: q273814    时间: 2014-12-23 15:32
aimei_8866999 发表于 2014-12-23 00:49
判断了

好吧 我也实在想不到什么情况 毕竟我也不是很懂这些
作者: chen71512    时间: 2015-1-1 22:37
那岂不是说如果我使用 线程.扩展开启 命令 就永远也不能回收内核对象?
作者: 18635976122    时间: 2018-8-23 14:26
五哥 用你的收货 昨晚到期了! 昨天还看你更新来! 现在找不到代理了 能给推荐个靠谱的代理 或者联系我吗 五哥 一天不收货 好难受 我Q 563325883
作者: 18635976122    时间: 2018-8-23 14:27
五哥 用你的收货 昨晚到期了! 昨天还看你更新来! 现在找不到代理了 能给推荐个靠谱的代理 或者联系我吗 五哥 一天不收货 好难受 我Q 563325883




欢迎光临 TC官方合作论坛 (http://bbs.52tc.co/) Powered by Discuz! X3.1