免费注册 查看新帖 |

Chinaunix

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

[函数] 线程,共享库,内存泄露。 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-02-22 10:57 |只看该作者 |倒序浏览
问题:一个线程调用一个so的接口,该接口中会有分配内存的操作(假设该接口有内存泄露)。如果线程退出后,系统是否会自动回收so中泄露的内存。


论坛徽章:
4
水瓶座
日期:2013-09-06 12:27:30摩羯座
日期:2013-09-28 14:07:46处女座
日期:2013-10-24 14:25:01酉鸡
日期:2014-04-07 11:54:15
2 [报告]
发表于 2013-02-22 11:05 |只看该作者
不会的, 都是进程的内存, 不释放就泄露了, 做so插件架构最起码都得提供个init和free的接口。

论坛徽章:
0
3 [报告]
发表于 2013-02-22 11:30 |只看该作者
补充下我这里把线程设置成了detach,我也搜索了下发现下面一个答案:

创建一个线程默认的状态是joinable, 如果一个线程结束运行但没有被join,则它的状态类似于进程中的Zombie Process,即还有一部分资源没有被回收(退出状态码),所以创建线程者应该调用pthread_join来等待线程运行结束,并可得到线程的退出代码,回收其资源(类似于wait,waitpid)

可以在子线程中加入代码
pthread_detach(pthread_self())
或者父线程调用
pthread_detach(thread_id)(非阻塞,可立即返回)
这将该子线程的状态设置为detached,则该线程运行结束后会自动释放所有资源。回复 2# linux_c_py_php


   

论坛徽章:
8
CU大牛徽章
日期:2013-04-17 10:59:39CU大牛徽章
日期:2013-04-17 11:01:45CU大牛徽章
日期:2013-04-17 11:02:15CU大牛徽章
日期:2013-04-17 11:02:36CU大牛徽章
日期:2013-04-17 11:02:58技术图书徽章
日期:2013-12-04 10:48:50酉鸡
日期:2014-01-03 10:32:30辰龙
日期:2014-03-06 15:04:07
4 [报告]
发表于 2013-02-22 11:57 |只看该作者
回复 3# cskyrain


    倒,这都哪跟哪啊……

论坛徽章:
0
5 [报告]
发表于 2013-02-22 12:35 |只看该作者
呵呵..............
shan_ghost 发表于 2013-02-22 11:57
回复 3# cskyrain

论坛徽章:
30
摩羯座
日期:2013-12-23 17:28:38牛市纪念徽章
日期:2015-07-13 11:35:582022北京冬奥会纪念版徽章
日期:2015-08-07 17:10:57青铜圣斗士
日期:2015-11-27 17:45:3815-16赛季CBA联赛之天津
日期:2016-02-15 13:44:3615-16赛季CBA联赛之江苏
日期:2018-05-02 16:56:2715-16赛季CBA联赛之辽宁
日期:2018-08-08 13:41:1015-16赛季CBA联赛之深圳
日期:2018-10-02 18:05:0315-16赛季CBA联赛之天津
日期:2019-05-31 15:05:0615-16赛季CBA联赛之北京
日期:2022-06-30 13:34:1115-16赛季CBA联赛之同曦
日期:2022-07-06 19:33:5415-16赛季CBA联赛之吉林
日期:2022-12-28 14:16:22
6 [报告]
发表于 2013-02-22 13:02 |只看该作者
线程用的是进程的资源,即使线程退出或者动态库被移出代码区,但是分配的内存是不会释放的,除非进程结束,系统回收进程内存,自己的一点见解

论坛徽章:
8
CU大牛徽章
日期:2013-04-17 10:59:39CU大牛徽章
日期:2013-04-17 11:01:45CU大牛徽章
日期:2013-04-17 11:02:15CU大牛徽章
日期:2013-04-17 11:02:36CU大牛徽章
日期:2013-04-17 11:02:58技术图书徽章
日期:2013-12-04 10:48:50酉鸡
日期:2014-01-03 10:32:30辰龙
日期:2014-03-06 15:04:07
7 [报告]
发表于 2013-02-22 13:40 |只看该作者
1、资源不仅仅是内存

2、资源和进程(而不是线程)绑定
所以,进程占用的资源,会在结束后被操作系统自动回收。
但,一些特殊的资源,比如某些锁,是可以跨进程的。它们往往无法随进程退出而被自动回收。

3、线程本身就是种资源。至少,它得在操作系统中加一个调度入口。
detach的线程,意思是执行结束后,自动删除与该线程关联的控制数据。但也就仅此而已。
至于该线程执行时申请的资源,由于并不和该线程绑定(见2),所以不可能在线程结束时自动回收。

论坛徽章:
36
CU大牛徽章
日期:2013-09-18 15:24:20NBA常规赛纪念章
日期:2015-05-04 22:32:03牛市纪念徽章
日期:2015-07-24 12:48:5515-16赛季CBA联赛之辽宁
日期:2016-03-30 09:26:4715-16赛季CBA联赛之北控
日期:2016-03-30 11:26:2315-16赛季CBA联赛之广夏
日期:2016-05-20 15:46:5715-16赛季CBA联赛之吉林
日期:2016-05-24 11:38:0615-16赛季CBA联赛之青岛
日期:2016-05-30 13:41:3215-16赛季CBA联赛之同曦
日期:2016-06-23 16:41:052015年亚洲杯之巴林
日期:2015-02-03 15:05:04CU大牛徽章
日期:2013-09-18 15:24:52CU十二周年纪念徽章
日期:2013-10-24 15:46:53
8 [报告]
发表于 2013-02-23 10:22 |只看该作者
学习了,看了楼上几位的解释,我认为是这样的:谁分配谁负责释放。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP