设置线程分离的方法
创始人
2024-02-28 19:49:32
0

线程分离的设置方法

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 
#include 
#include 
#include 
#include 
#include 
#include 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;
}

相关内容

热门资讯

喜欢穿一身黑的男生性格(喜欢穿... 今天百科达人给各位分享喜欢穿一身黑的男生性格的知识,其中也会对喜欢穿一身黑衣服的男人人好相处吗进行解...
发春是什么意思(思春和发春是什... 本篇文章极速百科给大家谈谈发春是什么意思,以及思春和发春是什么意思对应的知识点,希望对各位有所帮助,...
网络用语zl是什么意思(zl是... 今天给各位分享网络用语zl是什么意思的知识,其中也会对zl是啥意思是什么网络用语进行解释,如果能碰巧...
为什么酷狗音乐自己唱的歌不能下... 本篇文章极速百科小编给大家谈谈为什么酷狗音乐自己唱的歌不能下载到本地?,以及为什么酷狗下载的歌曲不是...
家里可以做假山养金鱼吗(假山能... 今天百科达人给各位分享家里可以做假山养金鱼吗的知识,其中也会对假山能放鱼缸里吗进行解释,如果能碰巧解...
华为下载未安装的文件去哪找(华... 今天百科达人给各位分享华为下载未安装的文件去哪找的知识,其中也会对华为下载未安装的文件去哪找到进行解...
四分五裂是什么生肖什么动物(四... 本篇文章极速百科小编给大家谈谈四分五裂是什么生肖什么动物,以及四分五裂打一生肖是什么对应的知识点,希...
怎么往应用助手里添加应用(应用... 今天百科达人给各位分享怎么往应用助手里添加应用的知识,其中也会对应用助手怎么添加微信进行解释,如果能...
苏州离哪个飞机场近(苏州离哪个... 本篇文章极速百科小编给大家谈谈苏州离哪个飞机场近,以及苏州离哪个飞机场近点对应的知识点,希望对各位有...
客厅放八骏马摆件可以吗(家里摆... 今天给各位分享客厅放八骏马摆件可以吗的知识,其中也会对家里摆八骏马摆件好吗进行解释,如果能碰巧解决你...