0

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

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

4

1 回答 1

4

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

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

因此,通常最好这样做:

CloseHandle(handle);
handle = INVALID_HANDLE_VALUE;

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

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

handle = CreateThread(...);

它现在是分配给新线程的句柄,您可以GetExitCodeThread再次调用,直到使用CloseHandle.

于 2013-01-08T18:14:45.573 回答