如何回收RPC运行时分配的线程句柄?

时间:2013-01-22 13:24:13

标签: c++ windows multithreading rpc handles

一点背景:

我正在开发一个使用RPC通过网络进行通信的Windows程序。网络连接连续建立和断开。 RPC调用是同步的,但有多个客户端线程同时运行。程序是对称的 - 也就是说,双方充当客户端和服务器,并且运行完全相同的软件。它是使用标准Windows API在C ++中实现的。

问题:

Process Explorer报告的线程句柄数随着时间的推移而增加。似乎线程由RPC运行时生成来处理请求,但是在回收线程时并不总是清理句柄。

特别是当传输大量数据时,或者同时发生许多呼叫时,这个数字会增加(这两个因素是相辅相成的,我不确定哪个是相关的。)

活动服务器可以在几天内构建数千个未使用的线程句柄,而在任何时候都不会使用超过20个线程。

问题:

我可以做些什么来防止手柄数量的增加,因为我认为它可能会导致客户站点出现稳定性问题?

1 个答案:

答案 0 :(得分:0)

嗯,令人惊讶的是,即使线程终止,也不会释放所有资源。你必须在从beginthreadex收到的线程句柄上调用CloseHandle()或者调用什么东西。另外,不要(!!!)使用CreateThread(),请参阅MSDN文档。

还有另一件事,虽然这不会导致你的问题,这是线程的永久启动和终止。相反,使用线程池。此外,这取决于您的实际设置,每个网络接口只需要一个线程用于IO,每个CPU需要一个线程用于计算。使用线程池,您可以轻松限制此数量。保持这些控制应该限制线程创建/清理和上下文切换引起的开销。如果连接在网络IO,CPU和可能的磁盘IO甚至UI之间切换很多,这并不总是可行的。