pthread_detach函数

 线程分离状态:指定该状态,线程主动与主控线程断开关系。使用pthread_exit或者线程自动结束后,其退出状态不由其他线程获取,而直接自己自动释放。网络、多线程服务器常用。

        进程若有该机制,将不会产生僵尸进程。僵尸进程的产生主要由于进程死后,大部分资源被释放,一点残留资源仍存于系统中,导致内核认为该进程仍存在。

        也可使用 pthread_create函数参2(线程属性)来设置线程分离。pthread_detach函数是在创建线程之后调用的。

函数描述:实现线程分离
函数原型:int pthread_detach(pthread_t thread);
函数返回值:成功:0;失败:错误号
         一般情况下,线程终止后,其终止状态一直保留到其它线程调用pthread_join获取它的状态为止。但是线程也可以被置为detach状态,这样的线程一旦终止就立刻回收它占用的所有资源,而不保留终止状态。不能对一个已经处于detach状态的线程调用pthread_join,这样的调用将返回EINVAL错误。也就是说,如果已经对一个线程调用了pthread_detach就不能再调用pthread_join了。

以一个例子引入:编写程序,在创建线程之后设置线程的分离状态。

说明:如果线程已经设置了分离状态,则再调用pthread_join就会失败,可用这个方法验证是否已成功设置分离状态。

#include<iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <unistd.h>
#include <pthread.h>
using namespace std;
 
//线程执行函数
void *mythread(void *arg)
{
        cout << "child thread, pid==" << getpid() << ", id==" << pthread_self() << endl;
        sleep(10);
}
 
int main()
{
        //int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
    //                      void *(*start_routine) (void *), void *arg);
        //创建子线程
        pthread_t thread;
        int ret = pthread_create(&thread, NULL, mythread, NULL);
        if(ret!=0)
        {
                cout << "pthread_create error, " << strerror(ret) << endl;
                return -1;
        }
        cout << "main thread, pid==" << getpid() << ", id==" << pthread_self() << endl;
 
        //设置线程为分离属性
        pthread_detach(thread);
 
        //子线程设置分离属性,则pthread_join不再阻塞,立刻返回
        ret = pthread_join(thread, NULL);
        if(ret!=0)
        {
 
                cout << "pthread_join error, " << strerror(ret) << endl;
        }
 
        //目的是为了让子线程能够执行起来
        sleep(1);
        return 0;
}

也可以利用pthread_create的第二个参数设置分离属性,部分核心代码如下:

int main()
{
        //定义pthread_attr_t类型的变量
        pthread_attr_t attr;
 
        //初始化attr变量
        pthread_attr_init(&attr);
 
        //设置attr为分离属性
        pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
 
        //创建子线程
        pthread_t thread;
        int ret = pthread_create(&thread, &attr, mythread, NULL);
        if(ret!=0)
        {
                cout << "pthread_create error, " << strerror(ret) << endl;
                return -1;
        }
        cout << "main thread, pid==" << getpid() << ", id==" << pthread_self() << endl;
 
        //释放线程属性
        pthread_attr_destroy(&attr);
 
        //验证子线程是否为分离属性
        ret = pthread_join(thread, NULL);
        if(ret!=0)
        {
                cout << "pthread_join error, " << strerror(ret) << endl;
        }
 
        return 0;
}

 

 

 

转载自:https://blog.csdn.net/m0_60663280/article/details/121589479

posted @ 2024-01-26 17:44  FBshark  阅读(109)  评论(0编辑  收藏  举报