文章目录
前言
默认情况下,线程是可连接的(结合态),也就是说,当线程退出时,其他线程可以通过调用pthread_join()函数获取其返回状态,通过pthread_join()实现线程之间的通信。
但有时,在编程过程中,程序并不关心线程的返回状态,只是希望系统在线程终止时能够自动清理并移除。在这种情况下,可以调用pthread_detach()函数并向thread参数传入指定线程的标识符,将该线程标记为处于分离状态(分离态)
一、pthread_detach()函数
函数:
#include <pthread.h>
int pthread_detach(pthread_t thread);
参数:线程的标示符
一旦线程处于分离状态,就不能再使用pthread_join()函数来获取其状态,也无法使其重返“可连接”状态。
例:
#include <pthread.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
void *thread_one(void * arg)
{
int i;
long t2;
long result=0;
sleep(3);
t2=(long)arg;
for (i = 0; i <= t2; i++)
{
result=result+i;
}
printf("threadone arg is %ld pthread_exit!\n",t2);
pthread_exit((void *)result);
//return (void *)result;//效果与pthread_exit((void *)result)一样
}
int main(int arg,char ** argv)
{
int res,rc;
pthread_t thread;
long t=100;
long result2;
rc = pthread_create( &thread,NULL,thread_one,(void *)t);
pthread_detach(thread);//设置线程分离
if(rc) printf("create error \n");
sleep(4);//延时,让thread_one先执行
void * thread_result;
res = pthread_join(thread,&thread_result);//等待线程结束,接收线程的返回值存储在thread_result中
//if(res) printf("join error \n");
result2=(long)thread_result;
if(res==0) //pthread_join成功返回值为0
{
printf("this is result %ld\n",result2);
}
}
运行结果:
从结果可以看出,即使在程序中调用了pthread_join()函数去接收线程的返回值,但由于在pthread_join()前面调用了pthread_detach()函数,将线程设置为分离态,pthread_join()失效。
二、pthread_attr_setdetachstate实现线程分离
设置线程分离状态,也可以在线程刚一创建时即进行分离(而非之后再调用pthread_detach()函数),这主要是对创建线程的第二个参数就行配置
步骤:
1.声明变量:
pthread_attr_t attr;
2.采用默认的方式对线程属性结构进行初始化:
pthread_attr_init(pthread_attr_t *attr);
3.为创建分离线程而设置属性
pthread_attr_setdetachstate();
函数原型:int pthread_attr_setdetachstate(pthread_attr_t *attr, int detachstate);
参数detachstate用来设置线程的状态,设置PTHREAD_CREATE_DETACHED(分离态)与PTHREAD_CREATE_JOINABLE(结合态)
4.创建线程:
pthread_create( &thread,&attr,thread_one,(void *)t);
5.摧毁属性对象:
pthread_attr_destroy(pthread_attr_t *attr);
注:线程创建函数函数原型:
int pthread_create(pthread_t *thread, const pthread_attr_t *attr,void *(*start_routine) (void *), void *arg);
在声明第二个变量时,不采取声明其为一个指针,只是在后面传参时取地址
具体看上面的声明变量和创建线程时我的做法
#include <pthread.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
void *thread_one(void * arg)
{
int i;
long t2;
long result=0;
sleep(3);
t2=(long)arg;
for (i = 0; i <= t2; i++)
{
result=result+i;
}
printf("threadone arg is %ld pthread_exit!\n",t2);
//pthread_exit((void *)result);
return (void *)result;//效果与pthread_exit((void *)result)一样
}
int main(int arg,char ** argv)
{
int res,rc;
pthread_t thread;
long t=100;
long result2;
pthread_attr_t attr;
pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
rc = pthread_create( &thread,&attr,thread_one,(void *)t);
pthread_attr_destroy(&attr);
//pthread_detach(thread);
if(rc) printf("create error \n");
sleep(4);//延时,让thread_one先执行
void * thread_result;
res = pthread_join(thread,&thread_result);//等待线程结束,接收线程的返回值存储在thread_result中
//if(res) printf("join error \n");
result2=(long)thread_result;
if(res==0) //pthread_join成功返回值为0
{
printf("this is result %ld\n",result2);
}
}
运行结果和使用pthread_detach()函数实现线程分离一样。