我需要调用 CloseHandle 吗?
Do I need to call CloseHandle?
我有创建线程并在程序完成时用 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 );
....
}
但为什么我需要关闭句柄呢?如果我不这样做会怎样?
这里有一个主题可以回答您的问题:
Can I call CloseHandle() immediately after _beginthreadex() succeeded?
你好。
是的,您需要在某个时候关闭句柄,否则您将泄漏有限的 OS 资源。
我可以建议为您的手柄创建一个 RAII 包装器吗?基本上,您编写一个包装器来存储您创建的句柄并在其析构函数中调用 CloseHandle。这样你就永远不必担心记住关闭它(当它超出范围时它会自动关闭)或者如果在打开句柄和关闭它之间发生异常时泄漏句柄。
如果您不关闭句柄,那么它将保持打开状态,直到您的进程终止。根据手柄后面的内容,这可能很糟糕。资源通常与句柄相关联,并且在您的程序终止之前不会清理这些资源;如果您只使用几个句柄,而这些句柄恰好是 'lightweight',那么这并不重要。其他句柄(例如文件句柄)对保持句柄打开有其他副作用,例如锁定打开的文件直到您的进程退出。这对用户或其他应用程序来说可能非常烦人。
一般来说,最好清理所有句柄,但在过程结束时,所有句柄都被关闭Windows。
But why do I need to close handle at all?
句柄是占用内核和用户空间内存的有限资源。保持句柄活动不仅需要一个整数值的存储空间,还意味着内核必须保留线程信息(例如用户时间、内核时间、线程 ID、退出代码),并且它不能回收线程 ID,因为您可以使用该句柄查询它。
因此,最佳做法是在不再需要时关闭句柄。
这是您根据 API 合同要做的事情(但您当然可以违反该合同)。
What will happens if I will not do so?
嗯,老实说……没什么。您将泄漏该句柄,但对于 一个句柄 的影响将无法衡量。当您的进程退出时,Windows 将关闭句柄。
不过,在正常情况下,您应该关闭不再需要的句柄,就像释放您分配的内存一样(即使操作系统也会在您的进程退出时释放它)。
虽然不显式释放资源甚至可能被认为是"optimization",但为了拥有正确的程序,应该始终这样做。正确性第一,优化第二。
此外,您越早释放资源(无论它有多小),它就越早可供系统重新使用。
我有创建线程并在程序完成时用 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 );
....
}
但为什么我需要关闭句柄呢?如果我不这样做会怎样?
这里有一个主题可以回答您的问题: Can I call CloseHandle() immediately after _beginthreadex() succeeded?
你好。
是的,您需要在某个时候关闭句柄,否则您将泄漏有限的 OS 资源。
我可以建议为您的手柄创建一个 RAII 包装器吗?基本上,您编写一个包装器来存储您创建的句柄并在其析构函数中调用 CloseHandle。这样你就永远不必担心记住关闭它(当它超出范围时它会自动关闭)或者如果在打开句柄和关闭它之间发生异常时泄漏句柄。
如果您不关闭句柄,那么它将保持打开状态,直到您的进程终止。根据手柄后面的内容,这可能很糟糕。资源通常与句柄相关联,并且在您的程序终止之前不会清理这些资源;如果您只使用几个句柄,而这些句柄恰好是 'lightweight',那么这并不重要。其他句柄(例如文件句柄)对保持句柄打开有其他副作用,例如锁定打开的文件直到您的进程退出。这对用户或其他应用程序来说可能非常烦人。
一般来说,最好清理所有句柄,但在过程结束时,所有句柄都被关闭Windows。
But why do I need to close handle at all?
句柄是占用内核和用户空间内存的有限资源。保持句柄活动不仅需要一个整数值的存储空间,还意味着内核必须保留线程信息(例如用户时间、内核时间、线程 ID、退出代码),并且它不能回收线程 ID,因为您可以使用该句柄查询它。
因此,最佳做法是在不再需要时关闭句柄。
这是您根据 API 合同要做的事情(但您当然可以违反该合同)。
What will happens if I will not do so?
嗯,老实说……没什么。您将泄漏该句柄,但对于 一个句柄 的影响将无法衡量。当您的进程退出时,Windows 将关闭句柄。
不过,在正常情况下,您应该关闭不再需要的句柄,就像释放您分配的内存一样(即使操作系统也会在您的进程退出时释放它)。
虽然不显式释放资源甚至可能被认为是"optimization",但为了拥有正确的程序,应该始终这样做。正确性第一,优化第二。
此外,您越早释放资源(无论它有多小),它就越早可供系统重新使用。