Wait函数和CloseHandle依赖

Wait Functions and CloseHandle Dependency

本文关键字:依赖 CloseHandle 函数 Wait      更新时间:2023-10-16

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

注意:一个StackOverFlow问题回答我第二部分说我不能再次调用GetExitCode ,但它并没有澄清是否缺少调用CloseHandle后等待函数导致内存泄漏或不

为了避免内存泄漏,您必须调用CloseHandle。在关闭HANDLE之后使用GetExitCodeThreadWaitForSingleObject等函数会导致未定义的行为。它可能在某些时候工作,但在其他情况下,它可能会崩溃或返回错误的答案。正如在破坏自己:关闭句柄然后使用它

中所解释的那样

当给定一个无效的参数时,WaitForSingleObject返回WAIT_FAILED是真的,句柄回收意味着任何无效的句柄都可以突然再次有效(但是引用一个不相关的对象)。

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

CloseHandle(handle);
handle = INVALID_HANDLE_VALUE;

这意味着任何试图使用该句柄的操作都将失败,并给出相应的错误码。

一旦正确地清理了句柄,就可以安全地使用它来创建另一个线程了。

handle = CreateThread(...);

它现在是一个句柄,被分配给你的新线程,你可以再次调用GetExitCodeThread,直到你用CloseHandle做最后的清理。