等待函数和CloseHandle依赖项

时间:2013-01-08 09:34:46

标签: c++ winapi memory-leaks thread-safety wait

我决定使用Wait Functions (WaitForSingleObject,WaitForMultipleObject等)来正确退出线程。在这种情况下,问题是我需要显式调用CloseHandle (线程句柄)以避免内存泄漏或等待函数清理并自行关闭句柄?如果需要明确调用CloseHandle,我是否可以再次调用“ CreateThread (相同的线程句柄) ?我可以调用< strong> GetExitCodeThread()再次?

注意:一个StackOverFlow问题回答我第二部分我不能再次调用GetExitCode ,但它没有说明在Wait函数导致内存泄漏与否之后是否缺少调用CloseHandle。 / p>

1 个答案:

答案 0 :(得分:3)

为避免内存泄漏,您必须致电CloseHandle。在GetExitCodeThread关闭后使用WaitForSingleObjectHANDLE等函数会导致未定义的行为。它可能会在某些时候起作用,但在其他情况下它可能会崩溃或返回错误的答案。正如Sabotaging yourself: Closing a handle and then using it

中所述
  

虽然WaitForSingleObject在给定无效参数时返回WAIT_FAILED是正确的,但句柄回收意味着任何无效句柄都会突然再次变为有效(但引用不相关的对象)。

出于这个原因,通常最好这样做:

CloseHandle(handle);
handle = INVALID_HANDLE_VALUE;

这意味着尝试使用句柄的任何内容都将失败并显示相应的错误代码。

正确清理手柄后,可以安全地使用它来创建另一个线程。

handle = CreateThread(...);

现在它是一个分配给新主题的句柄,您可以再次致电GetExitCodeThread,直到您使用CloseHandle进行最终清理。