线程的属性由pthread_attr_t结构类型表示。
在使用pthread_attr_t之前,需要调用pthread_attr_init对其初始化。pthread_attr_init为pthread_attr_t结构里面的各个属性设置默认值。程序可以修改这些值,定制线程的各个属性。在使用完pthread_attr_t后,需要调用pthread_attr_destroy,完成一些清理工作。
int pthread_attr_init(pthread_attr_t *attr);
功能:初始化一个线程对象的属性,并将其设为默认值
参数:attr:要初始化的线程属性
返回值:返回0,表示函数初始化对象成功。失败时返回一个错误代码。
int pthread_attr_destroy(pthread_attr_t *attr);
功能:销毁一个目标结构,并且使它在重新初始化之前不能重新使用。
参数:attr:要删除的线程属性
返回值:返回0,表示函数销毁对象成功。失败时返回一个错误代码。
(1)分离状态(detached state):若线程终止时,线程处于分离状态,系统不保留线程终止的状态。当不需要线程的终止状态时,可以分离线程(调用pthread_detach 函数)。若在线程创建的时候,就已经知道以后不需要使用线程的终止状态时,可以在线程创建属性里面指定该状态,那么线程一开始就处于分离状态。通过下面两个函数,设置和获取线程的分离属性。
int pthread_attr_getdetachstate(pthread_attr_t *attr, int *detachstate);
功能:获取线程的分离属性
参数:attr:线程属性
detachstate :将获得的分离属性存放到此变量中
返回值:成功返回0,错误返回错误编号
int pthread_attr_setdetachstate(pthread_attr_t *attr, int detachstate);
功能:设置线程的分离属性
参数:attr:线程属性
detachstate:要设置的分离属性
PTHREAD_CREATE_DETACHED:分离状态。PTHREAD_CREATE_JOINABLE:结合状态
返回值:成功返回0,错误返回错误编号
(2)栈大小(stack size):当系统中有很多线程时,可能需要减小每个线程栈的默认大小,防止进程的地址空间不够用;当线程调用的函数会分配很大的局部变量或者函数调用层次很深时,可能需要增大线程栈的默认大小。如果用完了线程栈的虚拟地址空间,可以使用malloc或mmap来为其他栈分配空间。
int pthread_attr_setstack(pthread_attr_t *attr,void *stackaddr, size_t stacksize);
功能:设置线程栈的大小和位置
参数:stackaddr:栈的内存单元中的最低地址。(注,最低地址不一定是栈的开始位置对于某些处理器结构来说,栈是从高地址向低地址方向伸展的,那么stackaddr就是栈的结束位置)
stacksize:栈的大小
返回值:成功返回0,失败返回错误编号
int pthread_attr_getstack(pthread_attr_t *attr,void **stackaddr, size_t *stacksize);
功能:获取线程栈的大小和位置
参数:stackaddr:栈的内存单元中的最低地址。(注,最低地址不一定是栈的开始位置对于某些处理器结构来说,栈是从高地址向低地址方向伸展的,那么stackaddr就是栈的结束位置)
stacksize:栈的大小
返回值:成功返回0,失败返回错误编号
注:如果stacksize小于PTHREAD_STACK_MIN或超出一些根据实现定义的限制,则pthread_attr_setstack( )会失败。
如果希望改变栈的大小, 又不自己处理栈的分配问题,则可以使用下面两个函数
int pthread_attr_setstacksize(pthread_attr_t *attr, size_t stacksize);
功能:设置线程栈的大小
参数:
attr:栈的属性
stacksize:要设置的栈大小
返回值:成功返回0,失败返回错误编号
int pthread_attr_getstacksize(pthread_attr_t *attr, size_t *stacksize);
功能:获取线程栈的大小
参数:
attr:栈的属性
stacksize:存放栈大小
返回值:成功返回0,失败返回错误编号
(3)栈保护区大小(stack guard size):在线程栈顶留出一段空间,防止栈溢出。当栈指针进入这段保护区时,系统会发出错误,通常是发送信号给线程。该属性默认值是PAGESIZE大小,该属性被设置时,系统会自动将该属性大小补齐为页大小的整数倍。当改变栈地址属性时,栈保护区大小通常清零。可以把guardsize设置为0,在这种情况下,不会提供警戒缓冲区。同样,如果对线程属性stackaddr做了修改,系统就会假设我们自己管理栈,并使警戒栈缓冲区无效。
int pthread_attr_setguardsize(pthread_attr_t *attr, size_t guardsize);
功能:设置栈保护区大小
参数:
attr:栈的属性
stacksize:要设置的栈保护区大小。为0时,无效该机制
返回值:成功返回0,失败返回错误编号
int pthread_attr_getguardsize(pthread_attr_t *attr, size_t *guardsize);
功能:获取栈保护区大小
参数:
attr:栈的属性
stacksize:存放获取的栈保护区大小
返回值:成功返回0,失败返回错误编号
其他一些属性:
线程的继承性:
函数pthread_attr_setinheritsched和pthread_attr_getinheritsched分别用来设
置和得到线程的继承性!
#include <pthread.h>
int pthread_attr_getinheritsched(const pthread_attr_t *attr,int *inheritsched);
int pthread_attr_setinheritsched(pthread_attr_t *attr,int inheritsched);
参数:
attr 线程属性变量
inheritsched 线程的继承性
若成功返回0,若失败返回-1。
请注意:
继承性决定调度的参数是从创建的进程中继承还是使用在
schedpolicy和schedparam属性中显式设置的调度信息。
线程没有默认的继承值设置,所以如果关心线程的调度策略和参数,
只能手动设置!
可设置参数:
PTHREAD_INHERIT_SCHED: 新的线程继承创建线程的策略和参数!
PTHREAD_EXPLICIT_SCHED:新的线程继承策略和参数来自于
schedpolicy和schedparam属性中显式
设置的调度信息!
>>>>>: 下面补充线程调度策略和调度参数:
<1>.调度策略:
函数pthread_attr_setschedpolicy和pthread_attr_getschedpolicy分别用
来设置和得到线程的调度策略。
int pthread_attr_getschedpolicy(const pthread_attr_t *, int * policy)
int pthread_attr_setschedpolicy(pthread_attr_*, int policy)
参数:
attr 线程属性变量
policy 调度策略
若成功返回0,若失败返回-1。
所谓调度策略也就是我们之前在OS中所学过的那些调度算法:
SCHED_FIFO :先进先出
SCHED_RR :轮转法
SCHED_OTHER :其他方法
SCHED_OTHER是不支持优先级使用的,而SCHED_FIFO和SCHED_RR
支持优先级的使用,他们分别为1和99,数值越大优先级越高.
注意:
> 此处的SCHED_FIFO是允许被高优先级抢占的!
> 也就是有高优先级的必须先运行
> SCHED_RR是设置一个时间片
> 当有SCHED_FIFO或SCHED_RR策赂的线程在一个条件变量
上等持或等持加锁同一个互斥量时,它们将以优先级顺序被唤
醒。即,如果一个低优先级的SCHED_FIFO线程和一个高优先
织的SCHED_FIFO线程都在等待锁相同的互斥且,则当互斥量
被解锁时,高优先级线程将总是被首先解除阻塞。
<2>.调度参数:
函数pthread_attr_getschedparam 和pthread_attr_setschedparam分别
用来设置和得到线程的调度参数。
int pthread_attr_getschedparam(const pthread_attr_t *,struct
sched_param *);
int pthread_attr_setschedparam(pthread_attr_t *,const struct
sched_param *);
参数:
attr 线程变量属性
param sched_parm 结构体
若成功返回0,若失败返回-1。
/usr/include /bits/sched.h
struct sched_param
{
int sched_priority; //!> 参数的本质就是优先级
};
注意:大的权值对应高的优先级!
系统支持的最大和最小的优先级值可以用函数:
sched_get_priority_max和sched_get_priority_min得到!
#include <pthread.h>
int sched_get_priority_max( int policy );
int sched_get_priority_min( int policy );
参数:max_: 系统支持的优先级的最小值
min_ : 系统支持的优先级的最大值
使用:max_ = sched_get_priority_max( policy );
min_ = sched_get_priority_min( policy );
注意参数是policy调用策略,也就是说对于不同的策略的值是不
一样的!