• 线程分离


    当我们使用默认属性创建一个线程的时候,线程是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);

    作者:cumtchw
    出处:http://www.cnblogs.com/cumtchw/
    我的博客就是我的学习笔记,学习过程中看到好的博客也会转载过来,若有侵权,与我联系,我会及时删除。

  • 相关阅读:
    学习笔记9(必做)
    团队作业(四):描述设计
    改进ls的实现(课下作业)
    stat命令的实现-mysate(必做)
    反汇编测试
    学习笔记8(必做)
    初次使用git上传代码到码云
    团队作业(三):确定分工
    学习笔记7(必做)
    缓冲区溢出漏洞实验
  • 原文地址:https://www.cnblogs.com/cumtchw/p/12029830.html
Copyright © 2020-2023  润新知