gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 14:10:50 25 4
gpt4 key购买 nike

一些背景知识:

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

问题:

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

尤其是在传输大量数据或同时发生许多调用时,数量会增加(这两个因素是相辅相成的,我不确定哪个是相关的)。

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

问题:

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

最佳答案

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

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

关于c++ - 如何回收 RPC 运行时分配的线程句柄?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14459612/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com