设置线程分离的方法

线程分离的设置方法

1)在创建线程时,利用thread_create函数的参2设置线程分离;

2)创建完线程后,通过pthread_detach函数设置线程分离。

第一种方法效率最高的。

1、创建线程时,设置线程分离

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

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

例子1

 代码如下:

利用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 << "this is 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;
}

运行结果如下:成功的设置了分离属性,调用pthread_jion失败

例子2

PthreadAttr.h
//==============================================================================
//                 
//                    PthreadAttr
//                    
//
//==============================================================================
class PthreadAttr
{
public:
    PthreadAttr();
    ~PthreadAttr();

private:
    pthread_attr_t m_Attr;

public:
    bool SetDetached();
    bool SetJoinable();
    bool GetDetachState(int *stat);
    const pthread_attr_t* GetPtr()        { return &m_Attr;   }
};



PthreadAttr.cpp
//==============================================================================
//                 
//                    PthreadAttr
//                    
//
//==============================================================================
PthreadAttr::PthreadAttr()
{
    pthread_attr_init(&m_Attr);
}

PthreadAttr::~PthreadAttr()
{
    pthread_attr_destroy(&m_Attr);
}

bool PthreadAttr::SetDetached()
{
    int iRet = pthread_attr_setdetachstate(&m_Attr, PTHREAD_CREATE_DETACHED);
    if (!iRet)
        return true;
    else
    {
        std::cout << "pthread_attr_setdetachstate detach fail ret=" 
		<< iRet << std::endl;
        return false;
    }
}
    
bool PthreadAttr::SetJoinable()
{
    int iRet = pthread_attr_setdetachstate(&m_Attr, PTHREAD_CREATE_JOINABLE);
    if (!iRet)
        return true;
    else
    {
        std::cout << "pthread_attr_setdetachstate join fail ret=" << iRet << std::endl;
        return false;
    }

}


bool PthreadAttr::GetDetachState(int *stat) 
{
    return !pthread_attr_getdetachstate(&m_Attr, stat);
}

2、创建线程之后设置线程分离

函数描述:实现线程分离

函数原型:int pthread_detach(pthread_t thread);

函数返回值:成功:0;失败:错误号

         一般情况下,线程终止后,其终止状态一直保留到其它线程调用pthread_join获取它的状态为止。但是线程也可以被置为detach状态,这样的线程一旦终止就立刻回收它占用的所有资源,而不保留终止状态。不能对一个已经处于detach状态的线程调用pthread_join,这样的调用将返回EINVAL错误。也就是说,如果已经对一个线程调用了pthread_detach就不能再调用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;
}

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值