免费注册 查看新帖 |

Chinaunix

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

求助 linux 线程编程问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-12-12 09:21 |只看该作者 |倒序浏览
写了一段应用程序,发现有内存泄漏。把程序分开测试,发现问题出在线程资源这一块,请各位大虾帮忙指点一二,最好能编译测试一下,我已经测试一个多星期了,就是没有找出原因,初学者,请多关照:)
/**************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 10:09 |只看该作者
你怎么知道你的程序有内存泄漏?

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

回楼上:)

用pmap查看进程内存 pmap pid
我在源程序中sleep的地方注释给出了我运行时的程序mapped内存的大小

论坛徽章:
0
4 [报告]
发表于 2005-12-12 13:04 |只看该作者
不是内存泄露问题,原因是Linux上创建线程后,操作系统设定的线程堆栈的缺省大小是10M(RHELAs3.0 Later)或8M(RHELAs2.1)。可以修改系统的堆栈大小,或者修改线程堆栈大小。

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

谢谢楼上的,不过我还是有疑问啊

你说的操作系统设定的线程堆栈的缺省大小是10M,这个我也看过相关资料。我的流程是主线程每次循环都在等待子线程的退出之后才继续循环的,循环结束之后难道线程的空间不会释放吗?

论坛徽章:
0
6 [报告]
发表于 2005-12-13 12:50 |只看该作者
原因可能调用了pthread_attr_setdetachstate(&pthread_attr,PTHREAD_CREATE_JOINABLE);  请删除这句话再试。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP