1

一点背景:

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

问题:

Process Explorer 报告的线程句柄数会随着时间的推移而增加。看起来线程是由 RPC 运行时创建来处理请求的,但是当线程被回收时,句柄并不总是被清除。

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

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

问题:

我可以做些什么来防止手柄计数安装,因为我认为这可能会导致客户站点的稳定性问题?

4

1 回答 1

0

好吧,令人惊讶的是,即使线程终止,也不会释放其所有资源。您必须调用CloseHandle()从 beginthreadex 收到的线程句柄或调用的内容。另外,不要(!!!)使用 CreateThread(),请参阅 MSDN 文档。

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

于 2013-01-22T19:54:05.983 回答