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

  • 相关阅读:
    新浪微博OAuth2授权错误 error:redirect_uri_mismatch
    [Eclipse]自动注释功能
    android 官网访问不了
    [转]Java开发中的23种设计模式详解
    [转]JAVA Iterator 的用法
    [转] Java集合类详解
    MySQL(root用户)密码重置
    SpringMVC项目接入Springfox实战遇到的问题集合
    linux中mysql完整卸载命令操作
    linux-centos挂载新硬盘操作
  • 原文地址:https://www.cnblogs.com/cumtchw/p/12029830.html
Copyright © 2011-2022 走看看