一、属性
线程的创建函数pthread_creat的第二个参数为pthread_attr_t类型的指针(默认属性创建线程时赋值NULL),pthread_attr_t是一个结构体类型,定义如下:
typedef struct
{
int detachstate; //线程的分离状态
int schedpolicy; //线程调度策略
struct sched_param schedparam; //线程的调度参数
int inheritsched; //线程的继承性
int scope; //线程的作用域
size_t guardsize; //线程栈末尾的警戒缓冲区大小
int stackaddr_set; //堆栈的地址集
void * stackaddr; //线程栈的位置
size_t stacksize; //线程栈的大小
}pthread_attr_t;
线程属性的使用步骤:创建属性对象--->以默认值初始化属性对象--->给属性对象赋值--->作为参数传给pthread_create()函数。
示例:以设置线程的分离状态为例,线程的分离状态取值有两种:
PTHREAD_CREATE_JOINABLE 0
PTHREAD_CREATE_DETACHED 1
二、编程练习
创建线程属性后,先以默认值对属性初始化,初始化成功后,读取一次线程的分离状态(默认是非分离状态),打印结果应该为0;接下来对线程的分离状态重新赋值,设为分离状态,在thread的入口函数中,再读一次线程的分离状态,若前面设置成功,则读出来的结果应该为1。
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <pthread.h>
pthread_attr_t attr;
void *pthread_test(void * pra)
{
int res;
int detachstate;
//获取线程的分离状态
res = pthread_attr_getdetachstate(&attr, &detachstate);
if(res)
{
printf("getdetachstate fail...\r\n");
exit(-1);
}
printf("thread detachstatus is %d\r\n",detachstate);
pthread_exit(NULL);
}
int main(void)
{
int res;
int detachstate;
pthread_t thread;
//初始化线程属性
res = pthread_attr_init(&attr);
if(res)
{
printf("thread attr init fail\r\n");
exit(-1);
}
//获取线程的分离状态
res = pthread_attr_getdetachstate(&attr, &detachstate);
if(res)
{
printf("getdetachstate fail...\r\n");
exit(-1);
}
printf("thread detachstatus is %d\r\n",detachstate);
//设置线程为分离状态,默认是非分离状态
res = pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
if(res)
{
printf("setdetachstate fail...\r\n");
exit(-1);
}
res = pthread_create(&thread,&attr,pthread_test,NULL);
if(res)
{
printf("thread create fail\r\n");
exit(-1);
}
pthread_exit(NULL);
return 0;
}
运行结果: