已完成线程使用的可用资源
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
:
螺纹可以是可连接的,也可以是可分离的。如果螺纹是可接合的,那么另一个线程可以调用pthreadjoin(3)来等待线程终止并获取其退出状态。仅当终止的可连接已加入的线程是其最后释放回的资源系统。当分离的线程终止时,其资源是自动的已自动释放回系统:无法加入线程以获得其退出状态。
也许创建线程的速度要快于完成线程的速度,因此内存使用量会不断增加。
相关文章:
- C++一个线程如何正确通信其任务已完成?
- CLion、MinGW 和 SDL2:进程已完成,退出代码为 -1073741515 (0xC0000135)
- 如何延迟生成已完成的项目序列并对其进行迭代
- 从矢量中删除已完成的线程
- CLion 没有调试我的目标之一 - 立即"进程已完成,退出代码为 0"
- 是否有任何标志指示 QT 主窗口渲染已完成
- 如何检查io_service中的任务是否已完成
- 如何确定哪个线程已完成
- OpenMP 是否将已完成部分的线程重用到另一个线程?
- WinAPI.检查窗口大小调整是否已完成
- 确定QProcess是否已完成执行或正在等待用户输入(或响应)
- 如果儿童进程崩溃,则QPROCESS ::已完成
- 外部二进制资源已打开,但QML中不存在
- 检查QVariantAnimation是否已完成
- 在释放静态内存之前已完成卸载DLL
- 如何使我的程序检查安装是否已完成,然后"come back to life"
- Outlook IMAP已完成电子邮件和附件下载事件
- 通知调用方线程已完成
- 已完成线程使用的可用资源
- 如何确保Qt小部件.重新油漆已完成运行