我必须在线程句柄上使用CloseHandle()吗?

时间:2010-10-18 13:10:44

标签: c++ windows handle

_beginthreadex返回一个线程的句柄:

m_hStreamStatsThread = (HANDLE) _beginthreadex( NULL, 0, StreamStatsThread, this, 0, NULL );

如果您需要在TerminateThread(..)之类的调用中引用线程,则可以使用此句柄。

根据the MSDN page on _beginthreadex,_beginthreadex不会总是返回有效句柄 - 例如它也可能在错误等情况下返回-1L。

当线程正常完成时,我是否必须在线程句柄上调用CloseHandle,或者我可以将其值设置为NULL / INVALID_HANDLE_VALUE?

2 个答案:

答案 0 :(得分:9)

同意Nemanja Trifunovic。

即使在线程退出后 - 它的句柄也是有效的。例如,您可以查询其返回值。

作为一般规则:除非另有说明,否则每个Win32句柄必须由CloseHandle关闭。

答案 1 :(得分:3)

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