如果一个线程结束运行 , 但没有被join 。则它的状态类似进程中的Zombie Process , 即还有一部分资源没有被回收 , 所以创建线程者应该调用pthread_join()来等待线程结束 , 并可得到线程的退出代码 , 回收其资源 。
如果父进程调用pthread_detach(child_thread_id)或者子进程调用pthread_detack(pthread_self())即可将子进程状态设置为detached , 该程序运行结束后会自动释放所有资源 。
4.2 关于在maps中显示[stack:TID]在进程maps中显示线程栈信息 , 最后在内核中被放弃 。
首先在《procfs: mark thread stack correctly in proc/<pid>/maps》中 , 添加了[stack:TID]用于表示此vma对应的是线程TID的stack区域 。
这样做的好处是 , 可以从maps中明确知道此段vma是被哪个线程使用的 。
有一个坏处就是先线程非常多情况下 , 主线程中为了显示[stack:TIS] , 开销就会很大 , 而实际上用处不是很大 。
所以在《proc: revert /proc/<pid>/maps [stack:TID] annotation》将进程maps中的[stack:TID]删除了 , 只显示为匿名内存 。
最终再《fs/proc: Stop trying to report thread stacks》将所有[stack:TID]全部移除 。
那么在没有[stack:TID]的情况下如何断定vma是否是线程栈呢?
首先线程栈大小可以通过ulimit -s查看 , 所以maps中vma大小和这个一致;并且属性应该是匿名的rw-p 。
然后上面应该是一页大小作为分隔区间 , 分隔页的属性应该是---p 。
【一个线程内存泄漏问题定位过程】
推荐阅读
- 康熙的和硕二十三公主,和硕和恪公主生了一个公主
- 员工行为准则的详细介绍
- 电影|五一多部大片跑路 电影《珠峰队长》逆流而上:做了一个不理智的决定
- 皇后是不是皇上的第一个老婆,太宗皇后叫什么名字
- 张良在史记中是什么世家,史记留侯世家张良是一个怎样的存在
- C语言预编译处理,如何定义一个带参数 宏?如何取消宏定义?
- 自己搭建一个网站需要多少钱
- 服务器出问题了,作为IT,怎样才能第一个知道?免得被骂
- 刘彻后面一个皇帝是谁母亲是谁,刘彻的母亲王皇后
- 一个被误解的乱世枭雄,一个被误解的星座
