- 线程属性
线程属性使用pthread_attr_t结构表示,该结构在被处理前需要对其进行初始化,在使用结束后需要销毁该结构体。可以通过pthread_attr_init()函数进行初始化,pthread_attr_destroy()函数进行销毁
名称 | pthread_attr_init() / pthread_attr_destroy() |
功能 | 对线程属性进行初始化和销毁 |
头文件 | #include<pthread.h> |
原型 | pthread_attr_init(pthread_attr_t *attr) pthread_attr_destroy(pthread_attr_t *attr) |
参数 | Attr线程属性变量 |
返回 | 0 成功; -1 失败 |
调用完pthread_attr_init()函数后,thread_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;
每个属性都对应了一些函数对其进行查询和修改
2. 线程的分离状态
线程的分离状态决定了线程执行完毕后以什么样的方式终止自己,创建线程时默认是非分离的,在这种情况下原有的线程必须等待创建的线程结束。只有当pthread_join()正确返回时,创建的线程才算终止,所占有的资源被释放
属性为分离状态的线程,不需要原有的线程等待创建的线程结束,当创建的线程结束后,线程自己释放所占有的资源
名称 | pthread_attr_getdetachstate() / pthread_attr_setdetachstate() |
功能 | 获取线程分离状态 / 设置线程分离状态 |
头文件 | #include<pthread.h> |
原型 | pthread_attr_getdetachstate(const pthread_attr_t *attr, int *detachstate) pthread_attr_setdetachstate(pthread_attr_t *attr, int detachstate) |
参数 | attr : 线程属性结构体 detachstate: 分离属性值;具有两个合法值,PTHREAD_CREATE_DETACHED ; PTHREAD_CREATE_JOINABLE |
返回 | 0 成功; -1 失败 |
#include<stdio.h>
#include<unistd.h>
#include<pthread.h>
pthread_t pid;
pthread_attr_t attr;
void *child(void *arg)
{
printf("child is running\n");
}
void main()
{
pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
pthread_create(&pid, &attr, child, NULL);
sleep(2);
pthread_attr_destroy(&attr);
}
3. 线程继承性
名称 | pthread_attr_getinheritsched / pthread_attr_setinheritsched |
功能 | 获取线程属性的继承性 / 设置线程的继承性 |
头文件 | #include<pthread.h> |
原型 | pthread_attr_getinheritsched(const pthread_attr_t *attr, int *inheritsched) pthread_attr_setinheritsched(const pthread_attr_t *attr, int inheritsched) |
参数 | attr : 线程属性 inheritsched : 继承性值; 具有两个取值 PTHREAD_INHERIT_SCHED :表示新创建的线程继承父线程的策略 PTHREAD_EXPLICIT_SCHED:使用设置的策略 |
返回 | 0 成功 ; -1 失败 |
4. 线程调度策略
名称 | pthread_attr_getschedpolicy / pthread_attr_setschedpolicy |
功能 | 获取 / 设置线程调度策略 |
头文件 | #include<pthread.h> |
原型 | pthread_attr_getschedpolicy(pthread_attr_t *attr, int *schedpolicy) pthread_attr_setschedpolicy(pthread_attr_t *attr, int schedpolicy) |
参数 | attr : 线程属性结构体 schedpolicy : 调度策略 取值 : SCHED_FIFO 先进先出;SCHED_RR 轮换; SCHED_OTHER 其他 |
返回 | 0 成功; -1 失败 |
5. 线程调度参数
名称 | pthread_attr_getschedparam / pthread_attr_setschedparam |
功能 | 获取 / 设置线程调度参数 |
头文件 | #include<pthread.h> |
原型 | pthread_attr_getschedparam(const pthread_attr_t *attr, struct sched_param schedparam) pthread_attr_setschedparam(pthread_attr_t *attr, const struct sched_param schedparam) |
参数 | attr : 线程属性结构体 schedparam : 线程调度参数 |
返回 | 0 成功; -1 失败 |
#include<stdio.h>
#include<pthread.h>
#include<string.h>
void *child(void *arg)
{
pthread_attr_t attr;
int policy;
int max_priority =0, min_priority = 0;
pthread_attr_init(&attr);
//设置/获取继承属性
pthread_attr_setinheritsched(&attr, PTHREAD_EXPLICIT_SCHED);
pthread_attr_getinheritsched(&attr, &policy);
if(policy == PTHREAD_EXPLICIT_SCHED)
{
printf("inherit sched : %d\n", policy);
}
else if(policy == PTHREAD_INHERIT_SCHED)
{
printf("inherit sched : %d\n", policy);
}
//设置/获取调度策略
pthread_attr_setschedpolicy(&attr, SCHED_RR);
pthread_attr_getschedpolicy(&attr, &policy);
if(policy == SCHED_RR)
{
printf("sched policy : SCHED_RR\n");
}
else if(policy == SCHED_FIFO)
{
printf("sched policy :SCHED_FIFO\n");
}
else{
printf("sched policy : SCHED_OTHER\n");
}
//设置/获取调度策略属性
max_priority = sched_get_priority_max();
min_priority = sched_get_priority_min();
printf("max_priority : %d\n", max_priority);
printf("min_priority : %d\n", min_priority);
param.sched_priority = max_priority;
pthread_attr_setschedparam(&attr, ¶m);
}
void main()
{
pthread_t pid;
pthread_create(&pid, NULL, child, NULL);
pthread_join(pid, NULL);
}