zoukankan      html  css  js  c++  java
  • 线程分离

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

  • 相关阅读:
    [美团 CodeM 初赛 Round A]最长树链
    [POI2005]Toy Cars
    [CodePlus2017NOV]晨跑
    [JLOI2011]不重复数字
    [NEERC2007][SHOI2008]Cactus Reloaded
    [NOI2015]软件包管理器
    [HAOI2015]树上操作
    CF1097D Makoto and a Blackboard
    Luogu P5339 [TJOI2019]唱、跳、rap和篮球
    HNCPC2019H 有向图
  • 原文地址:https://www.cnblogs.com/cumtchw/p/12029830.html
Copyright © 2011-2022 走看看