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

标签 c++ windows multithreading rpc handles

一些背景知识:

我正在开发一个使用 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/

相关文章:

c++ - 对象创建差异

c++ - 从临时返回按值 string_view 时,有没有办法获得编译器警告?

windows - 批处理文件 - 关闭由批处理文件进程打开的单独的 cmd 窗口

windows - 为什么 spark-shell 失败并显示 "' ""C:\Program' 在 Windows 上不被识别为内部或外部命令?

c# - 在非 UI 线程 Silverlight 5 浏览器应用程序中创建 UserControl

c# - 设置一次静态字段值并在所有其他线程中使用最新设置的值

c++ - 如何在 C++ 中修复 "no match for operator+"?

c++ - Qt 对象的生命周期

windows - 在 Windows 操作系统上将 SDL 与 FreePascal 链接(使用 Lazarus)

linux - 是否可以在 Linux 上使用 pthreads 打印 CPU 和核心