分享

linux创建线程内存回收

 sun317 2013-07-19

有三种方法可以回收线程内存

1.设置线程属性

    pthread_attr_t p_pth_attr;

    if  (0 != pthread_attr_init(&p_pth_attr))                                     
    {
        perror("pthread_attr_init"); 
        return -1;
    }


    if  (0 != pthread_attr_setdetachstate(&p_pth_attr, PTHREAD_CREATE_DETACHED))   
    {//此处设置成分离线程内存,一旦线程结束,立刻回收内存
        perror("pthread_attr_setdetachstate");
        return -1;
    }

记住 p_pth_attr 也要析构,否则也会内存泄漏 pthread_attr_destroy (& p_pth_attr );

2.在创建线程后调用pthread_join ()

3.使用pthread_detach()

void *ThreadFunc()

{

    static int count = 1;

    printf ("Create thread %d/n", count);

    pthread_detach (pthread_self());

    count++;

}

创建一个线程默认的状态是joinable, 如果一个线程结束运行但没有被join,则它的状态类似于进程中的Zombie Process,即还有一部分资源没有被回收(退出状态码),所以创建线程者应该调用pthread_join来等待线程运行结束,并可得到线程的退出代码,回收其资源(类似于wait,waitpid)
但是调用pthread_join(pthread_id)后,如果该线程没有运行结束,调用者会被阻塞,在有些情况下我们并不希望如此,比如在Web服务器中当主线程为每个新来的链接创建一个子线程进行处理的时候,主线程并不希望因为调用pthread_join而阻塞(因为还要继续处理之后到来的链接),这时可以在子线程中加入代码
pthread_detach(pthread_self())
或者父线程调用
pthread_detach(thread_id)(非阻塞,可立即返回)
这将该子线程的状态设置为detached,则该线程运行结束后会自动释放所有资源。

The pthread_detach () function indicates that system resources for the specified thread should be reclaimed when the thread ends. If the thread is already ended, resources are reclaimed immediately. This routine does not cause the thread to end. After pthread_detach () has been issued, it is not valid to try to pthread_join() with the target thread.

Eventually, you should call pthread_join () or pthread_detach () for every thread that is created joinable (with a detachstate of PTHREAD_CREATE_JOINABLE ) so that the system can reclaim all resources associated with the thread. Failure to join to or detach joinable threads will result in memory and other resource leaks until the process ends.

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多