参数简介
线程创建函数pthread_create有一个参数的类型为pthread_attr_t,该结构体的定义如下:
typedef struct
{
int detachstate;//线程的分离状态
int schedpolicy;//线程的调度策略
struct sched_param schedparam;//线程的调度参数
int inneritsched;//线程的继承性
int scope;//线程的作用域
size_t guardsize;//线程栈末尾的警戒缓冲区大小
int stackaddr_set;//线程堆栈的地址集
void *stackaddr;//线程栈的位置
size_t stacksize;//线程栈的大小
}pthread_attr_t;
1.分离状态
- 线程的分离状态决定一个线程以什么样的方式来终止自己.
- 在默认情况下, 线程是非分离状态的,这种情况下, 原有的线程等待创建的线程结束. 只有当pthread_join()函数返回时, 创建的线程才算终止, 才能释放自己所占用的资源.
分离线程没有被其他线程等待, 自己运行结束了, 线程也就终止了, 马上释放系统资源.
参数:
1.attr 线程属性变量
2.detachstate 分离状态属性
分离状态的两种属性:
PTHREAD_CREATE_DETACHED 以分离状态启动线程
PTHREAD_CREATE_JOINABLE 正常启动线程
2.线程的调度策略
所谓的调度策略也就是操作系统中的那些调度算法:
1.SCHED_FIFO:先进先出
2.SCHED_RR:轮转法
3.SCHED_OTHER:其他方法
前两种策略支持优先级并且只对超级用户有效, 最后一种方法不支持优先级.注意
- 此处的SCHED_FIFO是允许被高优先级抢占的, 即, 高优先级的必须先运行.
- SCHED_RR是设置一个时间片.
- 当有SCHED_FIFO或SCHED_RR策略的线程在同一条件变量上等待或者等待加锁同一个互斥量时, 它们将以优先级顺序被唤醒, 即优先级高的总是首先被解除阻塞.
3.调度参数
- 一个struct sched_param结构, 里面有一个sched_priority的参数, 其本质就是线程运行的优先级.
- sched_priority的默认值为0;
4.继承性
- 继承性决定调度的参数时从创建的线程中继承还是使用在schedpolicy和schedparam属性中显示设置的调度信息.
- 默认值为schedpolicy和schedparam属性中显式设置的值.
- 可设置的参数:
PTHREAD_EXPLICIT_SCHED 继承创建线程的策略和参数
PTHREAD_INHERIT_SCHED 继承属性中显式设置值
5.线程的作用域
- 线程的作用域表示了线程间竞争CPU的范围, 也就是说, 线程优先级的有效范围.
- POSIX标准中定义了两个值为:
- PTHREAD_SCOPE_PROCESS 进程级竞争资源
- PTHREAD_SCOPE_SYSTEM 系统级竞争资源
6.警戒缓冲区
- 线程警戒缓冲区控制者线程栈末尾之后以避免栈溢出的扩展内存大小. 这个属性默认设置为PAGESIZE个字节. 可以把guardsize线程属性设置为0, 从而不允许属性的这种特征行为发生, 在这种情况下不会提供警戒缓冲区.
- 同样的, 如果对线程属性stackaddr作了修改, 系统就会认为我们自己管理栈, 并使警戒区机制无效, 相当于把guardsize下成属性设为0.