2018-05-18 Linux之线程分离

任何时间点上线程是可结合(pthread_joined)的,同属一个进程下的线程可以被另一个线程回收资源或者杀死。在被回收之前该线程的栈区是不会释放的。相反,一个分离的(pthread_detached)线程是不能被其他线程回收或杀死的,它的存储器资源在它终止时由系统自动释放。

默认情况下,线程被创建成可结合的。为了避免存储器泄漏,每个可结合线程都应该要么被显示地回收,即调用pthread_join;要么通过调用pthread_detach函数被分离。如果一个可结合线程结束运⾏行但没有被join,则它的状态类似于进程中的Zombie Process, 即还有一部分资源没有被回收,所以创建线程者应该调用pthread_join来等待线程运行结束,并可得到线程的退出代码,回收其资源。
由于调用pthread_join后,如果该线程没有运行结束,调用者会被阻塞,在有些情况下我们并不希望如此。例如,在Web服务器中当主线程为每个新来的连接请求创建一个子线程进 行处理的时候,主线程并不希望因为调用pthread_join而阻塞(因为还要继续处理之后到来 的连接请求)

这时可以在子线程中加入代码

pthread_detach(pthread_self());

或者父线程调用

pthread_detach(thread_id)(⾮非阻塞,可⽴立即返回)

代码如下

#include
#include
#include
#include

void* pthread_running(void *_val)
{ 
    pthread_detach(pthread_self());
    printf("%s\n", (char*)_val);
    return NULL;
}

int main()
{ 
    pthread_t tid;
    int ret = pthread_create(&tid, NULL, pthread_running, "main thread is running");

    if(ret != 0)
    { 
        printf("create thread error! info is:%s\n", strerror(ret));
        return ret;
    }

    int temp = 0;
    sleep(1);
    if(0 == pthread_join(tid, NULL))
    { 
        printf("pthread wait success!\n");
        temp = 0;
    }
    else
    { 
        printf("pthread wait failed!\n");
        temp = 1;
    }

    return temp;
}
2018-05-18 Linux之线程分离_第1张图片
image.png

你可能感兴趣的:(2018-05-18 Linux之线程分离)