【问题标题】:Free resources used by finished thread已完成线程使用的空闲资源
【发布时间】:2013-06-28 14:22:23
【问题描述】:

我为 OpenWrt 开发了一个多线程缓存代理(Linux 用于路由器,因此可用的 RAM 很少)。我使用了 Boost 和 Curl 库,它运行良好,但它的 RAM 消耗并没有停止增加(内存泄漏)。

  • 我释放了所有动态分配的变量
  • 我关闭了所有打开的文件
  • 清理初始化的 curl 句柄
  • 全局变量是常量

这是我的主要代码的一部分:

while (true) {            
            ip::tcp::socket* socket = new ip::tcp::socket(io_service);
            acceptor.accept(*socket);
            pthread_t thread;
            pthread_create(&thread, NULL, handleRequest_thread, (void*) socket);            
            pthread_detach(thread);            
        }

内存泄漏肯定是“handleRequest_thread”发生的,所以我的问题是: 线程完成后有没有办法释放所有资源(内存、打开的文件...)?

【问题讨论】:

  • 您可能拥有分配线程本地内存的库,这取决于库的实现并不总是被破坏。尝试将您的程序转换为使用线程池来回收线程。 OpenMP 通常会自动执行此操作。您可以使用 OpenMP 任务构造来获得与 pthread_create 相同的效果。
  • 只使用一个线程后,我的应用程序消耗的内存更少,但它仍然随着时间的推移而增加:-(,我认为问题出在 libcurl
  • 对于内存限制的嵌入式设备来说,每个套接字使用一个线程似乎是不必要的开销。为什么不使用单个线程调用io_service 和异步方法?
  • 我没有尝试过异步编程,而且我有时间完成这个项目:)
  • 我建议在您的问题中包含更多代码来演示内存泄漏。

标签: c++ c memory-leaks boost-asio libcurl


【解决方案1】:

您不能自动释放所有资源(只能通过退出进程,但这不是很好的方法)。所以你必须控制你的资源,尽可能使用智能指针,自动关闭文件(例如使用 fstream )等。 至于线程:也许您应该改用 boost.thread,它会确保您不会忘记清理线程对象本身(使用普通 pthreads 很容易忘记)。

【讨论】:

  • 对不起,我没看懂最后关于boost线程的部分,boost.thread完成后会自动清理线程对象?
  • 不,它不会,直到你加入()它,它所做的是干净的线程句柄,当变量超出范围时。例如,对于 pthread,您必须自己调用干净的函数,这就是为什么更容易出错的原因。
  • 所以一个可能的解决方案是让另一个线程而不是主线程加入创建的线程?所以主线程可以处理其他请求?
  • 嗯,我不知道你的应用程序的架构,也许你根本不需要任何线程,至少 boost.asio 可以在不使用任何线程的情况下使用异步网络,如果你使用 curl multi接口它也可以以异步方式使用。
  • 只使用一个线程后,我的应用程序消耗更少的内存,但它仍然随着时间的推移而增加:-(,我认为问题出在 libcurl
【解决方案2】:

当它完成时,你是否销毁分离线程中的ip::tcp::socket*?线程的内存在加入时被释放,但这对于分离的线程不是必需的。分离线程的资源在完成后返回给系统。如果您能够分离线程,您可以检查pthread_detach 的退出状态。

来自手册页man pthread_create

线程可以是可连接的,也可以是可分离的。如果线程是可连接的, 然后另一个线程可以调用 pthread_join(3) 等待线程 终止并获取其退出状态。仅当终止可连接时 线程已加入是其最后释放的资源 系统。当一个分离的线程终止时,它的资源是自动的 自动释放回系统:无法加入 线程以获取其退出状态。

也许您创建线程的速度比完成线程快,因此您的内存使用量不断增加。

【讨论】:

  • 是的,我在 'handleRequest_thread' 结束时销毁了套接字
猜你喜欢
  • 2015-03-24
  • 1970-01-01
  • 2011-08-19
  • 2021-10-18
  • 1970-01-01
  • 1970-01-01
  • 2019-07-13
  • 2019-01-14
  • 2011-09-06
相关资源
最近更新 更多