分类: C/C++
2008-09-23 15:20:30
问题描述:
原
有的短信网关,每产生一个socket连接,就会create一个或多个thread去处理这个socket上的数据收发(数据收发是在
CTCPConnection类中完成,这个类自动创建线程)。根据观察,每次有新连接时,内存都会固定增长20M,并且当连接断开(所有new出来的内
存也被释放了)之后,内存并不使用并没有降低。表现为“内存泄露”的现象。
另一个奇怪的现象是:该问题只出现在四川现场,在家里做测试并无异常。
初步分析:
此问题看似内存泄露,但实际肯定不是。因为程序里并没有哪个地方申请了20M的内存,并且经过细致检查new和delete,初步排除了内存泄露的可能。知觉将问题所定在操作系统的软件配置和环境设置上。
试验结果:
为了进一步找出问题,书写了如下代码:
int main(int argc,char *argv[])
{
int i=0;
char *szP=NULL;
while(true){
i++;
szP=new char[10240];
delete []szP;
sleep(5);
}
}
运行测试发现内存随有攀升,但是能够降下来,说明环境本身的new和delete执行都是正常的。考虑到短信网关中,每次内存攀升都是伴随着新socket连接而产生,而新socket连接会引起新线程的创建。
故修改测试代码如下:
void *testthread(void *)
{
printf("I am working.\n");
char *szP=NULL;
szP=new char[10240];
delete []szP;
printf("I am stopping.\n");
pthread_exit(0);
}
int main(int argc,char *argv[])
{
int i=0;
pthread_t pid;
char *szP=NULL;
while(true){
i++;
pthread_create(&pid,NULL,testthread,&i);
printf("ok%d,pid=%d\n",i,pid);
sleep(5);
}
}
运行测试发现,每次线程创建,都会使内存使用攀升10M(在短信网关中,一个新的socket连接会引起两个线程的创建,而每次内存攀升的量刚好是20M)。
看
来问题已经非常明显,pthread_create存在问题。那么是环境问题还是使用方法上的问题呢?通过仔细阅读man手册,发现pthread一族函
数中有一个叫做pthread_detach的函数,其作用是将资源控制所有权交给子线程(put a running thread in the
detached state)。该函数应当由父线程调用。
以往我们写程序的时候,总是在pthread_create之后就万事大吉了,事实上
无论是win下还是*nix下,创建线程都有很多细节问题需要注意。这里面有一点需要说明,并不是pthread_create必须和
pthread_detach结对出现,怎样使用pthread_detach和资源所有权的使用策略相关。一个简单的做法就是通过
pthread_detach将资源所有权交给被创建的线程,这样,一旦该线程退出,pthread_create为其所分配的资源将得到有效释放。