求助 linux 线程编程问题
写了一段应用程序,发现有内存泄漏。把程序分开测试,发现问题出在线程资源这一块,请各位大虾帮忙指点一二,最好能编译测试一下,我已经测试一个多星期了,就是没有找出原因,初学者,请多关照:)
/**************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.
请各位帮忙测试测试,为什么会是这样的结果。
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
你怎么知道你的程序有内存泄漏?
用pmap查看进程内存 pmap pid
我在源程序中sleep的地方注释给出了我运行时的程序mapped内存的大小
不是内存泄露问题,原因是Linux上创建线程后,操作系统设定的线程堆栈的缺省大小是10M(RHELAs3.0 Later)或8M(RHELAs2.1)。可以修改系统的堆栈大小,或者修改线程堆栈大小。
你说的操作系统设定的线程堆栈的缺省大小是10M,这个我也看过相关资料。我的流程是主线程每次循环都在等待子线程的退出之后才继续循环的,循环结束之后难道线程的空间不会释放吗?
原因可能调用了pthread_attr_setdetachstate(&pthread_attr,PTHREAD_CREATE_JOINABLE); 请删除这句话再试。