0

我为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”,所以我的问题是:有没有办法在线程完成后释放所有资源(内存,打开的文件......)?

4

2 回答 2

0

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

于 2013-06-28T14:28:40.273 回答
0

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

从手册页man pthread_create

线程可以是可连接的或可分离的。如果一个线程是可连接的,那么另一个线程可以调用 pthread_join(3) 来等待线程终止并获取其退出状态。只有当一个终止的可连接线程被连接时,它的最后一个资源才会释放回系统。当一个分离的线程终止时,它的资源会自动释放回系统:不可能加入线程以获得它的退出状态。

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

于 2013-06-28T14:29:19.753 回答