pthread线程属性介绍

 线程属性

创建线程函数

int pthread_create (pthread_t* restrictthread,  const pthread_attr_t* restrictattr,void* (*start_routine) (void*), void* restrict arg);

的第二个参数即为线程属性,传空指针表示使用缺省属性。

线程属性为一个结构体,具体如下

typedef struct

{      

int        detachstate;       //线程的分离状态

int        schedpolicy;    //线程调度策略

structsched_param  schedparam;  //线程的调度参数

int         inheritsched;     //线程的继承性

int         scope;         //线程的作用域

size_t       guardsize;     //线程栈末尾的警戒缓冲区大小

void*       stackaddr;      //线程栈的位置

size_t       stacksize;        //线程栈的大小

}pthread_attr_t;

 

 

一、线程分离状态:detachstate

该属性决定了线程执行任务后以什么方式来结束自己。

方式如

(1) PTHREAD_CREATE_DETACHED    ——    分离线程

置为分离线程的线程,当不需要被任何线程等待,线程执行完任务后,自己自动结束线程,并释放资源。

(2) PTHREAD_CREATE_JOINABLE(缺省)  ——    可汇合线程

可汇合线程为线程的默认状态,这种情况下,原有的线程等待创建的线程结束。只有当pthread_join()函数返回时,创建的线程才算终止,才能释放自己占用的系统资源。


二、线程的调度策略:schedpolicy

(1) SCHED_FIFO(先进先出策略)

FIFO线程持续运行,直至有更高优先级的线程就绪,或者线程本身进入阻塞状态,

当FIFO线程阻塞时,系统将其移出就绪队列,恢复后再加入到同优先级就绪队列的末尾。当FIFO线程被高优先级线程抢占时,它在就绪队列中的位置不变,因此一旦高优先级线程终止或阻塞,被抢占的FIFO线程会立即继续运行

 

(2) SCHED_RR(轮转策略)

每个RR线程会获得一个时间片,一旦RR线程的时间片耗尽,系统即将移到就绪队列的末尾。

 

(3) SCHED_OTHER(缺省)

静态优先级为0。任何就绪的FIFO线程或RR线程,都会抢占此类线程。


三、调度参数 : sched_param  schedparam

这两个函数具有两个参数,第1个参数是指向属性对象的指针,第2个参数是sched_param结构或指向该结构的指针。结构sched_param在文件/usr/include /bits/sched.h中定义如下:

struct sched_param

{

       intsched_priority;

};

结构sched_param的子成员sched_priority控制一个优先权值,大的优先权值对应高的优先权。系统支持的最大和最小优先权值可以用sched_get_priority_max函数和sched_get_priority_min函数分别得到。

注意:如果不是编写实时程序,不建议修改线程的优先级。因为,调度策略是一件非常复杂的事情,如果不正确使用会导致程序错误,从而导致死锁等问题。如:在多线程应用程序中为线程设置不同的优先级别,有可能因为共享资源而导致优先级倒置

 

四、线程的继承性: inheritsched

(1) PTHREAD_INHERIT_SCHED(缺省) —— 调度属性自创建者线程继承

(2) PTHREAD_EXPLICIT_SCHED —— 调度属性由调度参数和调度策略决定

    继承性决定调度的参数是从创建的进程中继承还是使用在schedpolicy和schedparam属性中显式设置的调度信息。Pthreads不为inheritsched指定默认值,因此如果你关心线程的调度策略和参数,必须先设置该属性

 

五、线程的作用域:scope

线程的竞争范围。

PTHREAD_SCOPE_SYSTEM ——在系统范围内竞争资源。

PTHREAD_SCOPE_PROCESS(Linux不支持)——在进程范围内竞争资源

 

六、线程栈末尾的警戒缓冲区大小:guardsize

该属指定线程末尾的警戒缓冲区大小,在缺省的情况下为一个内存页(4096字节)

 

七、线程栈的位置:stackaddr

 

八、线程栈的大小:stacksize

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值