菜鸟提问:用CreateThread创建的线程,返回的句柄是不是一定要自己手工用CloseHandle释放?

奶糖人五号 2007-07-20 09:38:49
万一忘记了用一个句柄对象来装载CreateThread函数的返回值,是不是就一定导致这个句柄因没有释放而丢失?毕竟核心对象资源有限么
...全文
1694 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
stivenjia 2007-12-21
  • 打赏
  • 举报
回复
恩!
就算CloseHandle(hThread)但是这个线程没有return 之前仍然会继续运行
你CloseHandle后只是对该资源计数器进行--操作当--到0后系统将其回收
如果每次CreateThread后均不CloseHandle就像 yjgx007 说的将造成内存不足
zhangxuyu1118 2007-12-21
  • 打赏
  • 举报
回复
mark
flight_lcf 2007-07-22
  • 打赏
  • 举报
回复
CreateThread需要手动调用CloseHandle关闭句柄
beginthread开启的线程,在调用_endthread 时候会自动关闭句柄
beginthreadex需要手动关闭句柄

如下:
CreateThread、ExitThread 不适用于使用了CRT环境的C语言
_beginthread、_endthread 适用于CRT环境,但强烈建议使用ex系列函数代替(_endthread函数会直接关闭线程句柄)
_beginthreadex、_endthreadex 适用于CRT环境
AfxBeginThread、AfxEndThread 适用于MFC环境
wynney 2007-07-21
  • 打赏
  • 举报
回复
ExitThread(0);
yjgx007 2007-07-21
  • 打赏
  • 举报
回复
可以不调用CloseHandle,但资源处理是由Windows系统调整的,换句话说,如果不显式调用CloseHandle,被占用的资源虽然已释放,但句柄仍存在,系统就认为该资源仍末被释放,下次系统为新的进程或线程分配内存空间时,就不会使用这块资源。
开的线程越多,在线程结束后,并不显式调用CloseHandle,会造成可用内存不够的假象。
emptyness 2007-07-21
  • 打赏
  • 举报
回复
友情up and 粘贴.

Q:

看了一个程序觉得不懂.首先创建了一个线程,然后紧接着就把这个句柄给关闭了
hThread = (HANDLE)_beginthreadex(NULL,
0,
SearchProc,
lpFindData,
0,
&dummy
);
CloseHandle(hThread);
对于CloseHandle函数我不太明白,如果把句柄关掉,线程还能运行吗?

A:

CloseHandle关闭句柄并没有终止新创建的线程。只是表示对新创建的线程的引用不敢兴趣,系统会递减新 线程的线程内核对象的使用计数。当使用计数为0的时候,系统就会释放线程内核对象。如果在主线程中没有关闭线程的句柄,始终都会保留一个引用。这样线程内核对象的引用计数就不会 为0。即使新线程执行完毕,线程内核对象也不会被释放,只有等到进程终止的时候系统才会为 残留的对象做清理工作。所以应该在不再使用线程的句柄的时候将其关闭掉,让线程的线程内核对象的引用计数减1
Closing a thread handle does not terminate the associated thread. To remove a thread object, you must terminate the thread, and then close all handles to the thread.
MSDN上的一句话!

主线程没有任何特殊性,主线程退出并不会导致它所创建的线程退出!

在Windows上,所有的线程都是平等的,其实没有什么主线程和和从属线程的区别。你可能会说:你说的不对,我的主线程结束了,我的程序就退出了。这是因为我们大部分的程序都是Link了微软的CRT,主函数由它导入,当main函数结束的时候,CRT会叫到:

ExitProcess

于是所有的线程都同归于尽了。你感觉上好像其他线程都是主线程给弄没的。如果你不用CRT,或者是直接用汇编,主线程退出的时候不影响其他的线程。
lyg_zy 2007-07-21
  • 打赏
  • 举报
回复
顶,需要关闭。
krfstudio 2007-07-21
  • 打赏
  • 举报
回复
Positive, but it'll be closed by OS when your process ends.
奶糖人五号 2007-07-20
  • 打赏
  • 举报
回复
哦? 怎么设置,能否详细说下?
fantasyemperor 2007-07-20
  • 打赏
  • 举报
回复
不一定,你设置成自动删除线程,在线程结束后,资源会自动释放的。

15,471

社区成员

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

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