• 线程分离


    当我们使用默认属性创建一个线程的时候,线程是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/
    我的博客就是我的学习笔记,学习过程中看到好的博客也会转载过来,若有侵权,与我联系,我会及时删除。

  • 相关阅读:
    HTML语义化之常见模块
    取当前时间,格式为,yyyy-mm-dd hh:mm:ss
    利用JS 在网页上获取并显示当前日期 星期
    Javascript Math ceil()、floor()、round()三个函数的区别
    JS,JQUERY 常用笔记
    适配不同分辨率屏幕
    选取节点常用方法
    js控制使div自动适应居中
    点击jQuery Mobile的按钮改变颜色
    左侧固定宽度 右侧自适应
  • 原文地址:https://www.cnblogs.com/cumtchw/p/12029830.html
Copyright © 2020-2023  润新知