我需要调用 CloseHandle 吗?

vic*_*ico 5 c++ visual-c++

我有创建一个线程并CloseHandle在程序完成时关闭它的代码。

int main()
{
....

    HANDLE   hth1;
    unsigned  uiThread1ID;

    hth1 = (HANDLE)_beginthreadex( NULL,         // security
                                   0,            // stack size
                                   ThreadX::ThreadStaticEntryPoint,
                                   o1,           // arg list
                                   CREATE_SUSPENDED,  // so we can later call ResumeThread()
                                   &uiThread1ID );
....
CloseHandle( hth1 );

....

}
Run Code Online (Sandbox Code Playgroud)

但是为什么我需要关闭手柄呢?如果我不这样做会怎样?

Dam*_*mon 6

但为什么我需要关闭句柄呢?

句柄是占用内核和用户空间内存的有限资源。保持句柄处于活动状态不仅需要一个整数的存储空间,而且还意味着内核必须保留线程信息(例如用户时间、内核时间、线程 ID、退出代码),并且它无法回收线程 ID,因为您可以使用该句柄查询它。
因此,最佳做法是在不再需要句柄时关闭它们。

这就是您根据 API 合同要做的事情(但当然您可以打破该合同)。

如果我不这样做会发生什么?

好吧,说实话……没什么。您将泄漏该句柄,但对于一个句柄而言,其影响将无法衡量。当你的进程退出时,Windows 将关闭该句柄。

不过,在正常情况下,您应该关闭不再需要的句柄,就像释放已分配的内存一样(即使操作系统在进程退出时也会释放它)。

尽管不显式释放资源甚至可能被视为“优化”,但为了拥有正确的程序,应该始终这样做。正确性第一,优化第二。
此外,越早释放资源(无论它有多小),系统就能越快重新使用它。