关于线程运行和线程内核对象的关系

stoat 2008-08-29 09:13:46
每个线程都有其内核对象,内核对象中有对线程引用的计数。当用GetCurrentThread()等函数或取线程句柄时,计数就会增加;当用CloseHandle()释放线程句柄时,计数就减少。计数减为0时,内核对象就被释放。

那么这个内核对象的计数和线程的运行有什么关系?
若计数减为0时,线程还没运行完,系统会怎么处理?

...全文
209 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
lhsxsh 2008-08-29
  • 打赏
  • 举报
回复
回答的不错。学习了
liyinlei 2008-08-29
  • 打赏
  • 举报
回复
GetCurrentThread() 获取的线程句柄 是个伪句柄,并不会增加计数,用CloseHandle来释放这个伪句柄,也不会影响计数。


当内核对象的引用计数为0时,系统会释放内核对象。
线程的内核对象含有 大部分管理该线程的系统信息,如线程的退出码,线程的挂起计数等等。

当线程退出时,会对线程内核对象做如下事情:将内核对象的状态变为有信号,设置线程的退出码,引用计数减1。
内核对象不会被自动释放,除非所有指向该对象的外部指针都已经关闭,也就是说引用计数为0时,才释放。

不会出现“计数减为0时,线程还没运行”的情况。 线程在运行时,计数至少是1
pangqi022 2008-08-29
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 jasonshark 的回复:]
有两个计数,一个是CloseHandle可以减掉的,这个是HandleCount,另外还有一个总的PointerCount = HandleCount + ReferenceCount, ReferenceCount是内核里使用的,比如Scheduler要调度你的线程,就肯定得拿一个ReferenceCount, 这个是CloseHandle搞不掉的. 内核对象是否被释放看的是总的PointerCount,不是看HandleCount
[/Quote]

学习了!
jasonshark 2008-08-29
  • 打赏
  • 举报
回复
有两个计数,一个是CloseHandle可以减掉的,这个是HandleCount,另外还有一个总的PointerCount = HandleCount + ReferenceCount, ReferenceCount是内核里使用的,比如Scheduler要调度你的线程,就肯定得拿一个ReferenceCount, 这个是CloseHandle搞不掉的. 内核对象是否被释放看的是总的PointerCount,不是看HandleCount
jasonshark 2008-08-29
  • 打赏
  • 举报
回复
不会,CloseHandle以后句柄就失效了,也就没有从Handle到object的映射关系了,再CloseHandle会返回错误的. 这里说的都是实句柄, 伪句柄就更没关系了
stoat 2008-08-29
  • 打赏
  • 举报
回复
那我对同一个句柄多次掉用closeHandle(),会有什么结果。HandleCount 会变为负的么?那PointerCount也有可能变成0了。

15,466

社区成员

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

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