线程属性

线程的属性由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调用策略,也就是说对于不同的策略的值是不
                            一样的!








  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值