免费注册 查看新帖 |

Chinaunix

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

请教pthread编程-线程退出后为什么不会释放资源 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-09-07 11:44 |只看该作者 |倒序浏览
本帖最后由 wdove 于 2012-05-09 16:18 编辑

线程函数里什么都不干,pthread_join后线程占用的空间还是不释放。各位老大指教

tmp$ gcc a.c -lpthread
tmp$ ./a.out &
main process
[1] 3817
开始没有进入进程时,只有2M内存
tmp$ ps aux|grep -i a.out
b17931    3817  0.0  0.0   1728   392 pts/2    S    11:37   0:00 ./a.out
b17931    3819  0.0  0.0   3068   788 pts/2    R+   11:37   0:00 grep -i a.out
tmp$ thread fn1
线程执行完后,pthread_join了,应该释放内存,但是居然一直占用10M
tmp$ ps aux|grep -i a.out
3817  0.0  0.0  10056   460 pts/2    S    11:37   0:00 ./a.out
3822  0.0  0.0   3068   788 pts/2    R+   11:37   0:00 grep -i a.out
tmp$

程序代码:

  1. #include <stdio.h>
  2. #include <pthread.h>

  3. void* fn1(void* arg)
  4. {
  5.     printf("thread fn1\n");
  6.     return NULL;
  7. }


  8. int main()
  9. {
  10.     pthread_t tid;
  11.     printf("main process\n");

  12.     sleep(20);

  13.     pthread_create(&tid, NULL, fn1, NULL);
  14.     pthread_join(tid, NULL);

  15.     sleep(500);

  16.     return 0;
  17. }
复制代码

论坛徽章:
0
2 [报告]
发表于 2009-09-07 13:52 |只看该作者
ps出来的内存使用不一定就是正在用的,也有可能是曾经用过的但没有归还操作系统的

论坛徽章:
0
3 [报告]
发表于 2009-09-07 14:07 |只看该作者
你在最后加一句exit(0)试试

论坛徽章:
0
4 [报告]
发表于 2009-09-07 14:30 |只看该作者
在fn1最后一行不用return用pthread_exit看看

论坛徽章:
0
5 [报告]
发表于 2009-09-07 14:34 |只看该作者
建议你去看看linux内存管理有关的文档,系统所分配给进程的内存当进程不使用时不会立即归还给系统,而是作为一个private reserve 保存起来以备下次进程申请内存时使用,这样可以加快内存的申请而减少页交换。只有当进程堆顶未使用内存达到一定值时,例如128K的时候,才有可能真正地归还给系统。

论坛徽章:
0
6 [报告]
发表于 2009-09-07 14:56 |只看该作者
加pthread_exit()结果是一样的,
如果在fn1()里最后加exit(0), 程序直接退出。

谢谢ls的提示,有可能是这个原因,我也是不解,会去查询下

论坛徽章:
0
7 [报告]
发表于 2009-09-07 14:58 |只看该作者
这么说就算它不释放内存也不用担心它占用太多内存,当其他程序需要内存时,pthread占用的内存就会马上释放?

论坛徽章:
0
8 [报告]
发表于 2009-09-07 15:02 |只看该作者
原帖由 wdove 于 2009-9-7 14:58 发表
这么说就算它不释放内存也不用担心它占用太多内存,当其他程序需要内存时,pthread占用的内存就会马上释放?



是的,这个和windows不同

论坛徽章:
0
9 [报告]
发表于 2009-09-07 17:12 |只看该作者
找到问题所在了,因为thread默认栈大小是8192K
如果修改栈大小,就可以使占用内存变小,但仍是不能释放
  1.    
  2.     pthread_attr_t attr;

  3.     pthread_attr_init(&attr);
  4.     pthread_attr_setstacksize(&attr, 524288);   //512K

  5.     pthread_create(&tid, &attr, fn1, NULL);
复制代码

论坛徽章:
0
10 [报告]
发表于 2009-09-07 23:11 |只看该作者
原帖由 wdove 于 2009-9-7 17:12 发表
找到问题所在了,因为thread默认栈大小是8192K
如果修改栈大小,就可以使占用内存变小,但仍是不能释放
   
    pthread_attr_t attr;

    pthread_attr_init(&attr);
    pthread_attr_setstacksize(& ...



内存的使用取决于你开辟的大小,但是内存不释放的这个问题好像和内核有些关系,我在做livecd的时候碰上类似的问题。

打个比方我做的livecd大概是1G左右,内存是256M,当我强行弹出livecd之后文件系统不会马上崩溃,而是等待一段时间之后文件系统才会崩溃,这就说明内核先把这些东西装进内存,当他在一定的时间戳之后内核就会释放出来

你可以测试一下fedora 11的livecd
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP