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/
    我的博客就是我的学习笔记,学习过程中看到好的博客也会转载过来,若有侵权,与我联系,我会及时删除。

  • 相关阅读:
    python random模块
    PAMIE- Python实现IE自动化的模块
    python 教程 第一章、 简介
    python 教程 第三章、 运算符与表达式
    python 教程 第四章、 控制流
    python 教程 第五章、 函数
    python 教程 第六章、 模块
    python 教程 第七章、 数据结构
    职业生涯2
    Nginx 报错: nginx: [error] open() "/usr/local/nginx/logs/nginx.pid" failed (2: No such file or directory) 的解决方法
  • 原文地址:https://www.cnblogs.com/cumtchw/p/12029830.html
Copyright © 2011-2022 走看看