【问题标题】:Wait Functions and CloseHandle Dependency等待函数和 CloseHandle 依赖
【发布时间】:2013-01-08 09:34:46
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

    因此,通常最好这样做:

    CloseHandle(handle);
    handle = INVALID_HANDLE_VALUE;
    

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

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

    handle = CreateThread(...);
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多