我必须在线程句柄上 CloseHandle() 吗?
Posted
技术标签:
【中文标题】我必须在线程句柄上 CloseHandle() 吗?【英文标题】:Must I CloseHandle() on a thread handle? 【发布时间】:2010-10-18 13:10:44 【问题描述】:_beginthreadex 返回线程句柄:
m_hStreamStatsThread = (HANDLE) _beginthreadex( NULL, 0, StreamStatsThread, this, 0, NULL );
如果您需要在调用中引用线程,例如 TerminateThread(..),则可以使用此句柄。
根据the MSDN page on _beginthreadex,_beginthreadex 不会总是返回一个有效的句柄——例如它也可能在错误等时返回 -1L。
当一个线程正常完成后,我是否必须在线程句柄上调用 CloseHandle,或者我可以将其值设置为 NULL / INVALID_HANDLE_VALUE?
【问题讨论】:
【参考方案1】:同意 Nemanja Trifunovic。
即使在线程退出后 - 它的句柄仍然有效。例如,您可以查询它的返回值。
作为一般规则:除非另有说明,否则每个 Win32 句柄都必须由 CloseHandle
关闭。
【讨论】:
任何 Win32 kernel 句柄(即任何类型为HANDLE
的东西)。对于使用 WinAPI 的人来说是显而易见的,但我看到有人试图用 CloseHandle
关闭窗口/资源句柄(HWND
,HICON
,...)。 :)
是的,你是对的。关键是关闭内核句柄。那些HWND、HICON、HCURSOR等都是用户句柄。
P.S.用户句柄 - 我的意思是 - user32 支持的句柄。【参考方案2】:
您发布链接的 MSDN 页面上的代码示例包括对 CloseHandle()
的调用。将句柄的值设置为 NULL 并不会减少内核对象的内部引用计数,而且无论如何也几乎没有用处。
【讨论】:
以上是关于我必须在线程句柄上 CloseHandle() 吗?的主要内容,如果未能解决你的问题,请参考以下文章