已完成线程使用的可用资源

Free resources used by finished thread

本文关键字:资源 已完成 线程      更新时间:2023-10-16

我为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:

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

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