我开发了一个用于 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”,所以我的问题是: 有没有办法在线程完成后释放所有资源(内存,打开的文件......)?
答案 0 :(得分:0)
您无法自动释放所有资源(仅限退出流程,但这不是很好的方式)。所以你必须控制你的资源,尽可能使用智能指针,自动关闭文件(例如使用fstream)等。 至于线程:也许你应该使用boost.thread,它会确保你不会忘记自己清理线程对象(使用普通的pthreads你很容易忘记)。
答案 1 :(得分:0)
你完成后会破坏分离线程中的ip::tcp::socket*
吗?连接时释放线程的内存,但对于分离的线程,这不是必需的。分离线程的资源在完成后会返回给系统。如果能够分离线程,您可以检查pthread_detach
的退出状态。
来自手册页man pthread_create
:
线程可以是可连接的也可以是分离的。如果一个线程可以连接, 然后另一个线程可以调用pthread_join(3)来等待线程 终止并获取其退出状态。仅在终止可加入时 已加入的线程是其最后发布的资源 系统。分离的线程终止时,其资源是自动的 数学上释放回系统:无法加入 线程以获得其退出状态。
也许您可以更快地创建线程然后完成它们,因此您的内存使用量不断增加。