免费注册 查看新帖 |

Chinaunix

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

求助 c/c++ 线程编程问题(linux下) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-12-12 09:26 |只看该作者 |倒序浏览
写了一段应用程序,发现有内存泄漏。把程序分开测试,发现问题出在线程资源这一块,请各位大虾帮忙指点一二,最好能编译测试一下,我已经测试一个多星期了,就是没有找出原因,初学者,请多关照:)
/**************pthreadtest2.cpp ****************/
#include <stdio.h>
#include <iostream>
#include <vector>
#include <semaphore.h>
#include <pthread.h>
#include <sys/time.h>
#include <unistd.h>

using namespace std;

void* sendMsgs(void *arg)
{
        pthread_exit(NULL);
}

int main(void)
{
                sleep(30);       //此处用pmap 查看到mapped内存2280k
        
        unsigned int i = 0;        
               
                 //循环体内执行过程中通过pmap 查看到mapped内存14572k
        while( i < 65000)
        {
                i ++;
                int flag = 0;
                pthread_attr_t pthread_attr;
                pthread_attr_init(&pthread_attr);
                pthread_attr_setdetachstate(&pthread_attr,PTHREAD_CREATE_JOINABLE);                pthread_t threadSend;
                if( (flag = pthread_create(&threadSend,&pthread_attr,&sendMsgs,NULL) != 0 ) )
                {
                        cout << "create Error(threadSend):" << flag << endl;
                        break;
                }
               
                pthread_join(threadSend,NULL);
                pthread_attr_destroy(&pthread_attr);
        }        
        
        cout << "waiting ..." << endl;
        sleep(30);  //此处 mapped内存14572k
        
        return -1;
}

如果这个sendMsg内加入 string aa = "dfaaaaaadsfsd..."等等,那么内存吃得更多。
而且发现,吃掉内存的多少跟循环次数有关系,但不是线性关系;比如说循环1次和1000次他们吃掉的内存同样是6M左右,但是增加到某个数,一下就到了8M.
请各位帮忙测试测试,为什么会是这样的结果。

论坛徽章:
0
2 [报告]
发表于 2005-12-12 09:49 |只看该作者

没人帮忙看看啊,我实在是无法继续了,一直找不到答案,有经验的多帮忙啊:)

自己顶,不然沉了

论坛徽章:
0
3 [报告]
发表于 2005-12-12 10:13 |只看该作者
系统每次不是一次就分配那么多内存给你 应该按找2^n 给你 提高效率吧
string aa = "dfaaaaaadsfsd..."等等,那么内存吃得更多。

改成 static string aa = "dfaaaaaadsfsd..." 应该就不会分配那么多了

为什么会一下子用那么多内存  我猜得 是因为现在cpu 太快了 可以create 很多线程
你这样 很有可能崩溃掉得
因主线程可能迅速建立很多线程  子线程还没开始运行 已经建立了很多

论坛徽章:
0
4 [报告]
发表于 2005-12-12 10:28 |只看该作者
pthread_attr ,这个玩意是需要释放的吧!!!

论坛徽章:
0
5 [报告]
发表于 2005-12-12 11:19 |只看该作者

回复

1〉每次循环体内都是主先程pthread_join等待线程结束了啊,不存在创建了很多线程吧?
2〉每次循环体内都通过 pthread_attr_destroy(&pthread_attr);释放了pthread_attr
采用static是可以缓解,但是这是为什么呢?pthread_exit()的时候没有释放线程的资源吗?
查遍了资料,没有找到这个疑问的答案。

论坛徽章:
0
6 [报告]
发表于 2005-12-12 11:47 |只看该作者
线程退出时加下打印信息,可以写到文件里,加上线程号pthread_self()
可是试着休眠一会,看主程序执行情况,或者加入一些打印信息,比如在pthread_join()后等等

论坛徽章:
0
7 [报告]
发表于 2005-12-12 12:39 |只看该作者

好,抽空测试一下

3q

论坛徽章:
0
8 [报告]
发表于 2005-12-12 15:50 |只看该作者
呵呵,我刚才测试一下,那个多出来的10Md的内存是linux在创建线程时候缺省的,线成大小,这个大小在solaris缺省时1M,由于你的程序没有进行其余的内存操作,所以你虽然循环了,65000次但实际上,你现在的处理跟本没有涉及到并发,也就是使还是在一个线程空间,循环使用的,对你说的sring str="aaa",这个问题可能是由于linux  write&copy的问题,对于这个10M的内存没有被立刻释放,我感觉可能是这个内存是在stack上分配,所以释放的时间可能是由于系统确定。总的来说这样处理没有问题。

论坛徽章:
0
9 [报告]
发表于 2005-12-12 16:13 |只看该作者

回复 8楼 yixiao_wang 的帖子

在linux上试了一下,没觉得有问题:
#cat /proc/26333/status
Name:   a.out
State:  S (sleeping)
Tgid:   26333
Pid:    26333
PPid:   26088
TracerPid:      0
Uid:    0       0       0       0
Gid:    0       0       0       0
FDSize: 256
Groups: 0 1 2 3 4 6 10
VmSize:     2576 kB
VmLck:         0 kB
VmRSS:       732 kB
VmData:      292 kB
VmStk:         8 kB
VmExe:         4 kB
VmLib:      2208 kB
SigPnd: 0000000000000000
SigBlk: 0000000080000000
SigIgn: 0000000000000000
SigCgt: 0000000380000000
CapInh: 0000000000000000
CapPrm: 00000000fffffeff
CapEff: 00000000fffffeff

# cat /proc/26333/status
Name:   a.out
State:  S (sleeping)
Tgid:   26333
Pid:    26333
PPid:   26088
TracerPid:      0
Uid:    0       0       0       0
Gid:    0       0       0       0
FDSize: 256
Groups: 0 1 2 3 4 6 10
VmSize:     4632 kB
VmLck:         0 kB
VmRSS:       800 kB
VmData:     2348 kB
VmStk:         8 kB
VmExe:         4 kB
VmLib:      2208 kB
SigPnd: 0000000000000000
SigBlk: 0000000000000000
SigIgn: 0000000000000000
SigCgt: 0000000380000000
CapInh: 0000000000000000
CapPrm: 00000000fffffeff
CapEff: 00000000fffffeff

#cat /proc/26333/status
Name:   a.out
State:  S (sleeping)
Tgid:   26333
Pid:    26333
PPid:   26088
TracerPid:      0
Uid:    0       0       0       0
Gid:    0       0       0       0
FDSize: 256
Groups: 0 1 2 3 4 6 10
VmSize:     2588 kB
VmLck:         0 kB
VmRSS:       848 kB
VmData:      304 kB
VmStk:         8 kB
VmExe:         4 kB
VmLib:      2208 kB
SigPnd: 0000000000000000
SigBlk: 0000000080000000
SigIgn: 0000000000000000
SigCgt: 0000000380000000
CapInh: 0000000000000000
CapPrm: 00000000fffffeff
CapEff: 00000000fffffeff

论坛徽章:
0
10 [报告]
发表于 2005-12-12 16:23 |只看该作者

谢谢楼上的回复,我再侧测,我的测试结果让我还在怀疑

"65000次但实际上,你现在的处理跟本没有涉及到并发,也就是使还是在一个线程空间,循环使用的"
我的这个测试程序的出发点真正此处啊,没有并发,按道理应该不会增长的阿,你别用soliras,linux的线程机制跟soliars不同,linux线程是轻量级进程,用户级别的
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP