linux 线程非法退出导致内存泄露

用top发现virt的使用量一直在涨。于是可以断定有内存泄漏了,经过排查,最终确定原因出在多线程的问题上:

代码如下:

pthread_t thread_id;

int ret=pthread_create(&thread_id, NULL, flush_thread_work, (void*)&m_sql_client);

if(ret!=0){

APPSCORE_ERROR("Thread creation failed:%d",ret);

return ret;

}

在flush_thread_work函数内部:

void* flush_thread_work(void* args)

{

//....do something

return NULL;

}

代码中启动了一个线程之后,主进程就继续执行,任由新线程自生自灭了(没有调用thread_join),而主进程每隔一段时间就会拉起这样一个线程来做一些数据落地的事情。

这样的写法实际上是会造成内存泄漏的.

Linux man page 里有已经说明了这个问题:

When a joinable thread terminates, its memory resources (thread

descriptor and stack) are not deallocated until another thread performs

pthread_join on it. Therefore, pthread_join must be called once for

each joinable thread created to avoid memory leaks.

也就说线程执行完后如果不join的话,线程的资源会一直得不到释放而导致内存泄漏!

解决方法有两种:

a.在线程执行的函数内手工释放

void* flush_thread_work(void* args)

{

//....do something

pthread_detach(pthread_self());

return NULL;

}

b.在线程启动时,设置线程的PTHREAD_CREATE_DETACHED属性

pthread_attr_t attr;

pthread_attr_init (&attr);

pthread_attr_setdetachstate (&attr, PTHREAD_CREATE_DETACHED);

int ret=pthread_create(&thread_id, &attr, flush_thread_work, (void*)&m_sql_client);

if(ret!=0){

//记住attr也要析构,否则又是一个内存泄漏

pthread_attr_destroy (&attr);

APPSCORE_ERROR("Thread creation failed:%d",ret);

return ret;

}

//记住attr也要析构,否则又是一个内存泄漏

pthread_attr_destroy (&attr);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值