免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4195 | 回复: 3
打印 上一主题 下一主题

请问线程终止后,调用pthread_join()前,非分离线程未释放的是什么呢? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-11-27 16:55 |只看该作者 |倒序浏览
10可用积分
非分离线程在终止后,必须要有一个线程用 join 来等待它。否则,不会释放该线程的资源以供新线程使用,而这通常会导致内存泄漏。因此,如果不希望线程被等待,请将该线程作为分离线程来创建。



请问线程终止后,调用pthread_join()前,非分离线程未释放的是什么呢?是线程ID和状态么?

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
2 [报告]
发表于 2009-11-27 17:36 |只看该作者
每个线程 都分配一个固定的栈空间大小,这个是可配的 ulimit -s xxx ,释放的主要是这些内存,其余的thread id 这也算是资源,也要回收

个人理解,仅供参数

论坛徽章:
0
3 [报告]
发表于 2009-11-27 21:37 |只看该作者
参考了Sun 的多线程文档,非分离程的ID和状态将一直被保留,直到调用pthread_join(),但开发的时候,将线程的堆栈大小设为8M,非分离线程结束后,继续开新的非分离线程,程序所占的资源大小不变(suse 9)。




现在不敢确认:调用pthread_join()前,非分离线程未释放的是什么呢

论坛徽章:
0
4 [报告]
发表于 2009-11-27 22:55 |只看该作者
可以拿NPTL的源码来参考一下.
在NPTL线程库里面, struct pthread是线程描述结构, pthread_join()会最终会调用__free_tcb函数释放这个结构. (参见: pthread_join.c)
而在struct pthread结构本身是与线程栈一起, 通过allocate_stack函数分配的(参见pthread_create.c).
在pthread_join()通过__free_tcb进行释放时, 也是通过__deallocate_stack函数, 将struct pthread结构与线程栈一起释放.

所以, pthread_join()以前非分离线程未释放的应该就是它的struct pthread结构与线程栈.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP