线程分离

当我们使用默认属性创建一个线程的时候,线程是joinable的,对于一个joinable的线程, 线程创建者要调用pthread_join回收资源,否则可能会存在存储器资源泄漏,而对于datached的线程的存储器资源在它终止时由系统自动释放。

某项目中,用默认方式创建的线程,然后创建线程的函数在返回前忘记调用pthread_join函数,并且创建线程的函数是反复被调用的,这样每调用一次都会创建一个线程,并且没有回收线程资源,测试时发现存在内存泄漏,最后定位为线程资源没有释放。

代码如下

int func(...........)
{
    .....其他代码.....;
    bTimeExit = true;
    pthread_t threadTime;
    ret = pthread_create(&threadTime, NULL, Task_timeout, NULL);    
    
    ........其他代码.....;

    bTimeExit = false;
    return -5;  
}

void * Task_timeout(void *)
{
    struct timeval stamp;
    long timeSec = 0.0;
    while(bTimeExit)
    {    
        .......其他代码.....;
    }

    return 0;
}        

在具体的业务逻辑中,上面的funcA函数是被反复调用的,每次都会创建一个线程,而线程资源又没有回收,因此导致内存泄漏。

对线程设置分离属性之后,用top查看程序的内存消耗不再一直增加,修改方法如下,

方法一:

bTimeExit = true;
pthread_t threadTime;
pthread_attr_t attr; pthread_attr_init(
&attr); pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); ret = pthread_create(&threadTime, &attr, Task_timeout, NULL);

方法二:

bTimeExit = true;
pthread_t threadTime;
ret = pthread_create(&threadTime, NULL, Task_timeout, NULL);
pthread_detach(threadTime);
posted @ 2019-12-12 16:10  cumtchw  阅读(229)  评论(0编辑  收藏  举报