线程不设置成分离状态的隐患

引言:入职培训的时候讲课老师说建议大家在创建线程后马上将它设置为分离状态,否则它结束后资源不会被回收。鉴于他前面说的有些话并不准确,所以这句话我也不怎么相信。


  • 1.然后我在《UNIX环境下高级编程》的11.5节找到了下面这句话:

    在默认情况下,线程的终止状态会保存到对该线程调用pthread_join,如果线程已经被分离,线程底层存储资源可以在线程终止时被立即回收。

    • 那这里说的底层资源指包括哪些东西呢?
  • 2.然后我写了下面这段测试代码:

    #include "apue.h"
    #include <pthread.h>
    #include <sys/types.h>
    #include <unistd.h>
    #include <errno.h>
    #include <string.h>
    
    #define SIZE 40970
    int count = 0;
    void *thr_fn(void *arg)
    {
        int i = 0;
        //char *p=(char *)malloc(SIZE);assert(p!=NULL);
        char p[SIZE];
        for (i = 0; i < SIZE; i++)p[i] = (i % 9) + '0';
        count++; //free(p); //这里故意不释放内存的
        return ((void *)0);
    }
    
    int main()
    {
        pthread_t tid1;
        pthread_attr_t attr;
        int err = pthread_attr_init(&attr);
        if (err != 0)return (err);
        err = pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
        if (err != 0)return (err);
        while (1)
        {
            //int err=pthread_create(&tid1, &attr, thr_fn, (void *)1);
            int err = pthread_create(&tid1, NULL, thr_fn, (void *)1);
            if (err != 0)
            {
                printf("\nfailed:%s\n", strerror(errno));
                break;
            }
            else printf("\rcount = %d", count);
        }
        return 0;
    }
    
    • 运行结果大概像这样(就是在第32738次创建的时候内存不足了):
      count = 32738
      failed:Cannot allocate memory
      
      • 就是说:无论是在新线程中申请的堆内存还是栈内存,不释放都会造成资源泄漏,但是如果设置成分离状态或者pthread_join()等待线程结束系统都将回收这些资源从而避免这些问题。

  • 3.结论
    虽然不应该寄希望于系统来回收资源(按理应该手动free),但考虑到线程意外结束的情况,如果对线程的返回值不感兴趣的话,还是应该将线程设置成分离状态。
©️2020 CSDN 皮肤主题: 黑客帝国 设计师:上身试试 返回首页