完成的线程使用的免费资源

时间:2013-06-28 14:22:23

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

我开发了一个用于 OpenWrt 的多线程缓存代理(用于路由器的Linux,因此几乎没有可用的RAM)。我使用了Boost和Curl库,它工作正常,但它的RAM消耗不会停止增加(内存泄漏)。

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

以下是我的主要代码的一部分:

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

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

你完成后会破坏分离线程中的ip::tcp::socket*吗?连接时释放线程的内存,但对于分离的线程,这不是必需的。分离线程的资源在完成后会返回给系统。如果能够分离线程,您可以检查pthread_detach的退出状态。

来自手册页man pthread_create

  

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

也许您可以更快地创建线程然后完成它们,因此您的内存使用量不断增加。