前言
pthread_create 的第 2 个参数 attr 是一个结构体指针,结构体元素分别指定新线程的运行属性,各成员属性为:
_detachstate 表示新线程是否与进程中的其他线程脱离同步,如果置位则新线程不能用 pthread_join 函数来同步,且在退出时自行释放所占用的资源。默认为 PTHREAD_CREATE_JOINABLE 状态。这个属性也可以在线程创建并运行以后用 pthread_detach 函数来设置,而一旦设置为 PTHREAD_CREATE_DETACH 状态(不论是创建时设置还是运行时设置),则不能再恢复到 PTHREAD_CREATE_JOINABLE 状态。
_schedpolicy 表示新线程的调度策略,主要包括 SCHED_OTHER (正常、非实时)、SCHED_RR (实时、轮转法) 和 SCHED_FIFO (实时、先入先出) 三种,默认为 SCHED_OTHER,后两种调度策略仅对超级用户有效。运行时可以用 pthread_setschedparam 函数来改变。
_schedparam,一个 sched_param 结构,目前仅有一个 sched_priority 整型变量表示线程的运行优先级。这个参数仅当调度策略为实(即 SCHED_RR 或 SCHED_FIFO)时才有效,并可以在运行时通过 pthread_setschedparam 函数来改变,默认为 0。
_inheritsched 有两种值可供选择,即 PTHREAD_EXPLICIT_SCHED 和 PTHREAD_INHERIT_SCHED,前者表示新线程使用显式指定调度策略和调度参数(即 attr 中的值),而后者表示继承调用者线程的值。默认为 PTHREAD_EXPLICIT_SCHED。
_scope 表示线程间竞争 CPU 的范围,也就是说线程优先级的有效范围。POSIX 的标准中定义了两个值,即 PTHREAD_SCOPE_SYSTEM 和 PTHREAD_SCOPE_PROCESS ,前者表示与系统中所有线程一起竞争 CPU 时间,后者表示仅与同进程中的线程竞争 CPU。目前 Linux 仅实现了 PTHREAD_SCOPE_SYSTEM 一值。
属性设置是由一些函数来完成的,通常调用 pthread_attr_init 函数进行初始化。
设置绑定属性的函数为 pthread_attr_setscope;
设置分离属性的函数是 pthread_attr_setdetachstate;
设置线程优先级的相关函数 pthread_attr_getscehdparam(获取线程优先级)和 pthread_attr_setschedparam(设置线程优先级);
在设置完成属性后调用 pthread_creat 函数创建线程。
一、线程属性初始化
线程属性初始化为:
int pthread_attr_init(pthread_attr_t *attr);
attr :传出参数,表示线程属性,后面的线程属性设置函数都会用到。
返回值:成功 0,失败 -1.
二、设置绑定属性
设置绑定属性:
pthread_attr_setscope(pthread_attr_t *attr, init scope);
attr :线程属性
scope :PTHREAD_SCOPE_SYSTEM(绑定),PTHREAD_SCOPE_PRCESS(非绑定)。
返回值:成功 0,失败 -1。
三、设置分离属性
设置分离属性:
pthread_attr_setdetachstate(pthread_attr_t *attr, init detachstate);
attr:线程属性
detachstate:PTHREAD_CREATE_DETACHED(分离),PTHREAD_CREATE_JOINABLE(非分离)。
返回值:成功 0,失败 -1。
四、获取线程优先级
获取线程优先级:
int pthread_attr_getschedparam(pthread_attr_attr *attr, struct sched_param *param);
attr:线程属性。
param:线程优先级。
返回值:成功 0,失败 -1。
五、设置优先级
设置优先级:
int pthread_attr_setschedparam(pthread_attr_attr *attr, struct sched_param *param);
attr:线程属性。
param:线程优先级。
返回值:成功 0,失败 -1。