pthread引发的内存泄漏

pthread 创建的线程,默认不会在线程结束的时候,主动释放资源,最后造成pthread_create创建线程失败。
pthread_create返回值为11 ,errno为12 。
例如下面的代码,如果我们运行一段时间,创建线程就会报错。
pthread_t ReadThreadHandle;
static void * usbReadThread( void *para )
{
        int i;
        int k;
        for(i=0;i<100;i++)
        {
                k+=i;
        }
        sleep(1);
        return NULL;
}
int main(int argc, char *argv[])
{
        int ret;
        int count =0;
        while(1)
        {
                  
                ret = pthread_create(&(ReadThreadHandle),NULL,usbReadThread,NULL); 
                if(ret)
                {
                        ReadThreadHandle = 0;
                        printf("create thread failed count =%d errno=%d\n",count,errno);
                        sleep(10) ;
                }
                else
                {
                        printf("1create thread sucess %d\n",count);
                } 
                count++;
        }
        return 0;
}
原来pthread创建的线程有两种状态, joinable 和 detached 两种状态。
如果是joinable状态,线程结束的时候不会自动释放资源必须在调用pthread_join等待线程结束的时候才会释放线程的资源。线程创建的默认状态就是joinable。
所以针对上面的问题,我们把代码修改成
pthread_t ReadThreadHandle;
static void * usbReadThread( void *para )
{
        int i;
        int k;
        for(i=0;i<100;i++)
        {
                k+=i;
        }
        sleep(1);
        return NULL;
}
int main(int argc, char *argv[])
{
        int ret;
        int count =0;
        while(1)
        {
                  
                ret = pthread_create(&(ReadThreadHandle),NULL,usbReadThread,NULL); 
                if(ret)
                {
                        ReadThreadHandle = 0;
                        printf("create thread failed count =%d errno=%d\n",count,errno);
                        sleep(10) ;
                }
                else
                {
                        pthread_join(ReadThreadHandle,NULL);
                        printf("1create thread sucess %d\n",count);
                } 
                count++;
        }
        return 0;
}
在测试就不会出现线程创建不成功的问题了。


但是可能在某些情况下我们不想调用pthread_join等待线程终止,那么我们也可以将线程设置为detached状态。这是线程结束的时候,就会自动释放线程的资源。
但是如果设置为detached状态,就不能用pthread_join等待线程结束。这时即使线程还在跑,pthread_join也会马上返回。
设置为detached状态我们可以在线程中调用pthread_detach(pthread_self()) ;
下面是示例代码


pthread_t ReadThreadHandle;
static void * usbReadThread( void *para )
{
        int i;
        int k;
        pthread_detach(pthread_self()) ;
        for(i=0;i<100;i++)
        {
                k+=i;
        }
        sleep(1);
        return NULL;
}
int main(int argc, char *argv[])
{
        int ret;
        int count =0;
        while(1)
        { 
                ret = pthread_create(&(ReadThreadHandle),NULL,usbReadThread,NULL); 
                if(ret)
                {
                        ReadThreadHandle = 0;
                        printf("create thread failed count =%d errno=%d\n",count,errno);
                        sleep(10) ;
                }
                else
                {
                        printf("1create thread sucess %d\n",count);
                } 
                count++;
        }
        return 0;
}
运行上面的代码,也不会出现创建线程出错的现象。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值