我必须在线程句柄上 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 关闭窗口/资源句柄(HWNDHICON,...)。 :) 是的,你是对的。关键是关闭内核句柄。那些HWND、HICON、HCURSOR等都是用户句柄。 P.S.用户句柄 - 我的意思是 - user32 支持的句柄。【参考方案2】:

您发布链接的 MSDN 页面上的代码示例包括对 CloseHandle() 的调用。将句柄的值设置为 NULL 并不会减少内核对象的内部引用计数,而且无论如何也几乎没有用处。

【讨论】:

以上是关于我必须在线程句柄上 CloseHandle() 吗?的主要内容,如果未能解决你的问题,请参考以下文章

mfc线程

我需要调用 CloseHandle 吗?

Windows C++ - 使用 CloseHandle 关闭线程

VC++ 线程同步 总结

进程考试

delphi 在线程A中终止线程B