我有创建一个线程并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)
但是为什么我需要关闭手柄呢?如果我不这样做会怎样?
但为什么我需要关闭句柄呢?
句柄是占用内核和用户空间内存的有限资源。保持句柄处于活动状态不仅需要一个整数的存储空间,而且还意味着内核必须保留线程信息(例如用户时间、内核时间、线程 ID、退出代码),并且它无法回收线程 ID,因为您可以使用该句柄查询它。
因此,最佳做法是在不再需要句柄时关闭它们。
这就是您根据 API 合同要做的事情(但当然您可以打破该合同)。
如果我不这样做会发生什么?
好吧,说实话……没什么。您将泄漏该句柄,但对于一个句柄而言,其影响将无法衡量。当你的进程退出时,Windows 将关闭该句柄。
不过,在正常情况下,您应该关闭不再需要的句柄,就像释放已分配的内存一样(即使操作系统在进程退出时也会释放它)。
尽管不显式释放资源甚至可能被视为“优化”,但为了拥有正确的程序,应该始终这样做。正确性第一,优化第二。
此外,越早释放资源(无论它有多小),系统就能越快重新使用它。
| 归档时间: |
|
| 查看次数: |
4809 次 |
| 最近记录: |