亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
12下一頁
最近訪問板塊 發(fā)新帖
查看: 6810 | 回復: 10
打印 上一主題 下一主題

請教pthread編程-線程退出后為什么不會釋放資源 [復制鏈接]

論壇徽章:
0
跳轉到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2009-09-07 11:44 |只看該作者 |倒序瀏覽
本帖最后由 wdove 于 2012-05-09 16:18 編輯

線程函數(shù)里什么都不干,pthread_join后線程占用的空間還是不釋放。各位老大指教

tmp$ gcc a.c -lpthread
tmp$ ./a.out &
main process
[1] 3817
開始沒有進入進程時,只有2M內(nèi)存
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
線程執(zhí)行完后,pthread_join了,應該釋放內(nèi)存,但是居然一直占用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 [報告]
發(fā)表于 2009-09-07 13:52 |只看該作者
ps出來的內(nèi)存使用不一定就是正在用的,也有可能是曾經(jīng)用過的但沒有歸還操作系統(tǒng)的

論壇徽章:
0
3 [報告]
發(fā)表于 2009-09-07 14:07 |只看該作者
你在最后加一句exit(0)試試

論壇徽章:
0
4 [報告]
發(fā)表于 2009-09-07 14:30 |只看該作者
在fn1最后一行不用return用pthread_exit看看

論壇徽章:
0
5 [報告]
發(fā)表于 2009-09-07 14:34 |只看該作者
建議你去看看linux內(nèi)存管理有關的文檔,系統(tǒng)所分配給進程的內(nèi)存當進程不使用時不會立即歸還給系統(tǒng),而是作為一個private reserve 保存起來以備下次進程申請內(nèi)存時使用,這樣可以加快內(nèi)存的申請而減少頁交換。只有當進程堆頂未使用內(nèi)存達到一定值時,例如128K的時候,才有可能真正地歸還給系統(tǒng)。

論壇徽章:
0
6 [報告]
發(fā)表于 2009-09-07 14:56 |只看該作者
加pthread_exit()結果是一樣的,
如果在fn1()里最后加exit(0), 程序直接退出。

謝謝ls的提示,有可能是這個原因,我也是不解,會去查詢下

論壇徽章:
0
7 [報告]
發(fā)表于 2009-09-07 14:58 |只看該作者
這么說就算它不釋放內(nèi)存也不用擔心它占用太多內(nèi)存,當其他程序需要內(nèi)存時,pthread占用的內(nèi)存就會馬上釋放?

論壇徽章:
0
8 [報告]
發(fā)表于 2009-09-07 15:02 |只看該作者
原帖由 wdove 于 2009-9-7 14:58 發(fā)表
這么說就算它不釋放內(nèi)存也不用擔心它占用太多內(nèi)存,當其他程序需要內(nèi)存時,pthread占用的內(nèi)存就會馬上釋放?



是的,這個和windows不同

論壇徽章:
0
9 [報告]
發(fā)表于 2009-09-07 17:12 |只看該作者
找到問題所在了,因為thread默認棧大小是8192K
如果修改棧大小,就可以使占用內(nèi)存變小,但仍是不能釋放
  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 [報告]
發(fā)表于 2009-09-07 23:11 |只看該作者
原帖由 wdove 于 2009-9-7 17:12 發(fā)表
找到問題所在了,因為thread默認棧大小是8192K
如果修改棧大小,就可以使占用內(nèi)存變小,但仍是不能釋放
   
    pthread_attr_t attr;

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



內(nèi)存的使用取決于你開辟的大小,但是內(nèi)存不釋放的這個問題好像和內(nèi)核有些關系,我在做livecd的時候碰上類似的問題。

打個比方我做的livecd大概是1G左右,內(nèi)存是256M,當我強行彈出livecd之后文件系統(tǒng)不會馬上崩潰,而是等待一段時間之后文件系統(tǒng)才會崩潰,這就說明內(nèi)核先把這些東西裝進內(nèi)存,當他在一定的時間戳之后內(nèi)核就會釋放出來

你可以測試一下fedora 11的livecd
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復

  

北京盛拓優(yōu)訊信息技術有限公司. 版權所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關心和支持過ChinaUnix的朋友們 轉載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP