等待函数和 CloseHandle 依赖项

Ana*_*iam 1 c++ winapi memory-leaks thread-safety wait

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

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

Ste*_*eve 5

为了避免内存泄漏,您必须调用CloseHandle. 使用诸如aGetExitCodeThreadWaitForSingleObjectaHANDLE已关闭之类的函数会导致未定义的行为。它可能在某些时候有效,但在其他情况下可能会崩溃或返回错误的答案。正如自我破坏:关闭手柄然后使用它中所解释的

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

因此,通常最好这样做:

CloseHandle(handle);
handle = INVALID_HANDLE_VALUE;
Run Code Online (Sandbox Code Playgroud)

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

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

handle = CreateThread(...);
Run Code Online (Sandbox Code Playgroud)

现在它是分配给新线程的句柄,您可以GetExitCodeThread再次调用,直到使用 进行最终清理CloseHandle