线程属性
线程属性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;
对线程属性进行处理之前必须进行初始化,使用之后去初始化
int pthread_attr_init(pthread_attr_t *attr) int pthread_attr_destroy(pthread_attr_t *attr)
线程分离状态:
线程分离状态决定线程以怎样的方式终止
非分离状态终止的线程,可以被其他线程等待,pthread_join函数返回时,线程释放资源
分离状态的线程,不能被其他线程等待,线程结束后直接释放资源
int pthread_attr_getdetachstate(pthread_attr_t *attr,int *detachstate) int pthread_attr_setdetachstate(pthread_attr_t *attr,int detachstate)
detachstate的值:PTHREAD_CREATE_DETACHED
PTHREAD_CREATE_JOINABLE
线程继承属性:
线程的继承属性决定了调度信息是从创建线程的线程中继承,还是使用schedpolic和schedparam属性中设置的调度信息
int pthread_attr_getinheritsched(pthread_attr_t *attr,int *inheritsched) int pthread_attr_setinheritsched(pthread_attr_t *attr,int inheritsched)
inheritsched的值:PTHREAD_INHERIT_SCHED 新线程将继承创建线程的调度策略和参数
PTHREAD_EXPLICIT_SCHED 新线程将使用schedpolicy和schedparam作为调度策略和参数
线程的调度策略:
SCHED_FIFO:允许一个线程运行直到更高优先级的线程准备好,或直到自己自愿阻塞
SCHED_RR:如果一个SCHED_RR策略的线程运行超过一段时间没有阻塞,而另外的SCHED_RR线程或SCHED_FIFO线程已经准备好,则运行的线程将被抢占
SCHED_FIFO和SCHED_RR的几个线程同时等待一个互斥量或条件变量时,高优先级的线程将首先解除阻塞
int pthread_attr_getschedpolicy(pthread_attr_t *attr,int *schedpolicy) int pthread_attr_setschedpolicy(pthread_attr_t *attr,int schedpolicy)
线程调度参数:
struct sched_param
{
int sched_priority;
};
系统支持的最高、最低优先级:
int sched_get_priority_max(int pri_max) int sched_get_priority_min(int pri_min)
设置调度参数:
int pthread_attr_getschedparam(pthread_attr_t *attr,struct sched_param *schedparam) int pthread_attr_setschedparam(pthread_attr_t *attr,struct sched_prarm schedparam)
线程作用域:
线程作用域控制线程是在进程内还是在系统级上竞争资源
int pthread_attr_getscope(pthread_attr_t *attr,int *scope) int pthread_attr_setscope(pthread_attr_t *attr,int scope)
scope的值:PTHREAD_SCOPE_PROCESS 线程在进程内竞争资源
PTHREAD_SCOPE_SYSTEM 线程在系统级竞争资源
线程堆栈:
堆栈大小:
int pthread_attr_getstacksize(pthread_attr_t *attr,size_t *stacksize) int pthread_attr_setstacksize(pthread_attr_t *attr,size_t stacksize)
堆栈地址:
int pthread_attr_getstackaddr(pthread_attr_t *attr,void **stackaddr) int pthread_attr_setstackaddr(pthread_attr_t *attr,void *stackaddr)
合二为一:
int pthread_attr_getstack(pthread_attr_t *attr,void **stackaddr,size_t *stacksize) int pthread_attr_setstack(pthread_attr_t *attr,void *stackaddr,size_t stacksize)
线程栈末尾的警戒缓冲区大小:
int pthread_attr_getguardsize(pthread_attr_t *attr,size_t *guardsize) int pthread_attr_setguardsize(pthread_attr_t *attr,size_t guardsize)