通过属性设置线程的分离
1.线程属性类型: pthread_attr_t attr;
2.线程属性操作函数:
对线程属性变量的初始化
int pthread_attr_init(pthread_attr_t* attr);
设置线程分离属性
int pthread_attr_setdetachstate( pthread_attr_t* attr, int detachstate );
参数: attr : 线程属性
detachstate
PTHREAD_CREATE_DETACHED(分离)
PTHREAD_CREATE_JOINABLE(非分离)
释放线程资源函数
int pthread_attr_destroy(pthread_attr_t* attr);
#include<stdio.h>
#include<pthread.h>
#include<unistd.h>
#include<string.h>
void* myfunc(void *arg)
{
printf("child pthread id:%ld\n",pthread_self());
return 0;
}
int main()
{
pthread_t pthid;
int ret;
//init attr
pthread_attr_t attr;
pthread_attr_init(&attr);
//set attr
pthread_attr_setdetachstate(&attr,PTHREAD_CREATE_DETACHED);
ret = pthread_create(&pthid,&attr,myfunc,NULL);
if(ret != 0)
{
printf("error number is %d\n",ret);
printf("%s\n",strerror(ret));
}
printf("parent pthread id:%ld\n",pthread_self());
for(int i=0;i<5;i++)
{
printf("i=%d\n",i);
}
sleep(2);
pthread_attr_destroy(&attr);
return 0;
}
这段代码就是创建一个分离线程,主线程不用等它,他自己跑完自动回收资源,不需要pthread_join。
也可以用pthred_detach(pthid),就属于创建后将普通线程修改为分离线程,效果是一样的
#include<stdio.h>
#include<pthread.h>
#include<unistd.h>
#include<string.h>
void* myfunc(void *arg)
{
printf("child pthread id:%ld\n",pthread_self());
return NULL;
}
int main()
{
pthread_t pthid;
int ret;
ret = pthread_create(&pthid,NULL,myfunc,NULL);
if(ret != 0)
{
printf("error:%d %s\n",ret,strerror(ret));
}
// 创建完立刻设为分离态
pthread_detach(pthid);
printf("parent pthread id:%ld\n",pthread_self());
for(int i=0;i<5;i++){ printf("i=%d\n",i); }
sleep(2);
return 0;
}
两种方法都可以,完全等价。