首页 文章

等待函数和CloseHandle依赖项

提问于
浏览
0

我决定使用 Wait Functions (WaitForSingleObject,WaitForMultipleObject等)来正确退出线程 . 在这种情况下,问题是我需要 explicitly call CloseHandle (线程处理)以避免 memory leak 或等待函数清理并自行关闭句柄?如果需要显式调用 CloseHandle ,我能够调用“ CreateThread (相同的线程句柄) again 吗?我可以调用 GetExitCodeThread( ) again 吗?

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

1 回答

  • 3

    为避免内存泄漏,您必须调用 CloseHandle . 在 HANDLE 关闭后使用 GetExitCodeThreadWaitForSingleObject 等函数会导致未定义的行为 . 它可能会在某些时候起作用,但在其他情况下它可能会崩溃或返回错误的答案 . 如_1313991中所述_

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

    因此,通常最好这样做:

    CloseHandle(handle);
    handle = INVALID_HANDLE_VALUE;
    

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

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

    handle = CreateThread(...);
    

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

相关问题