繁体   English   中英

完成线程使用的免费资源

[英]Free resources used by finished thread

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

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

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

从手册页man pthread_create

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM