zoukankan      html  css  js  c++  java
  • pthread_attr_t 线程属性(一)

    1.    线程属性:
                
     使用pthread_attr_t类型表示,我们需要对此结构体进行初始化,
     

                    初始化后使用,使用后还要进行去除初始化!
                     pthread_attr_init:初始化
                     pthread_attr_destory:去除初始化       
                   
                    #include <pthread.h>
                    int pthread_attr_init(pthread_attr_t *attr);
                    int pthread_attr_destroy(pthread_attr_t *attr);   
                    若成功返回0,若失败返回-1。
                   
                    pthread_attr_init之后,pthread_t结构所包含的内容就是操作系统实现
                    支持的线程所有属性的默认值。
                   
                    如果pthread_attr_init实现时为属性对象分配了动态内存空间,
                    pthread_attr_destroy还会用无效的值初始化属性对象,因此如果经
                    pthread_attr_destroy去除初始化之后的pthread_attr_t结构被
                    pthread_create函数调用,将会导致其返回错误。
                   
                    线程属性结构如下:

                    typedef struct
                    {
                           int                           detachstate;     线程的分离状态
                           int                          schedpolicy;   线程调度策略
                           struct sched_param      schedparam;   线程的调度参数
                           int                          inheritsched;    线程的继承性
                           int                          scope;          线程的作用域
                           size_t                      guardsize; 线程栈末尾的警戒缓冲区大小
                           int                          stackaddr_set;
                           void *                     stackaddr;      线程栈的位置
                           size_t                      stacksize;       线程栈的大小
                    }pthread_attr_t;
                   
                    下面主要讨论此结构体!!!
                   
    2.    分离状态:
                线程的分离状态决定一个线程以什么样的方式来终止自己。
               
                我们已经在前面已经知道,在默认情况下线程是非分离状态的,这种情况   
                下,原有的线程等待创建的线程结束。只有当pthread_join() 函数返回       
                时,创建的线程才算终止,才能释放自己占用的系统资源。   
               
                分离线程没有被其他的线程所等待,自己运行结束了,线程也就终止了,
                马上释放系统资源。
               
                通俗的说也就是:我们知道一般我们要等待(pthread_join)一个线程的结束,
                主要是想知道它的结束状态,否则等待一般是没有什么意义的!但是if有一
                些线程的终止态我们压根就不想知道,那么就可以使用“分离”属性,那么我
                们就无须等待管理,只要线程自己结束了,自己释放src就可以咯!这样更
                方便!
               
                #include <pthread.h>
                int pthread_attr_getdetachstate(const pthread_attr_t * attr, int * detachstate);
                int pthread_attr_setdetachstate(pthread_attr_t * attr, int detachstate);
                参数:attr:线程属性变量
                        detachstate:分离状态属性   
                若成功返回0,若失败返回-1。
               
                设置的时候可以有两种选择:
                <1>.detachstate参数为:PTHREAD_CREATE_DETACHED     分离状态启动
                <2>.detachstate参数为:PTHREAD_CREATE_JOINABLE    正常启动线程
               
    3.    线程的继承性:
               
                函数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调用策略,也就是说对于不同的策略的值是不
                                一样的!
                   
                        附录:来自
                        http://www.yuanma.org/data/2006/0823/article_1392.htm
                        policy = SCHED_OTHER
                        max_priority = 0
                        min_priority = 0
       
                        Show SCHED_FIFO of priority
                        max_priority = 99
                        min_priority = 1
                       
                        Show SCHED_RR of priority
                        max_priority = 99
                        min_priority = 1
       
                        Show priority of current thread
                        priority = 0
                       
    3.    线程的作用域:
                                   
                函数pthread_attr_setscope和pthread_attr_getscope分别
                用来设置和得到线程的作用域。       
                #include <pthread.h>   
                int    pthread_attr_getscope( const pthread_attr_t * attr, int * scope );
                int pthread_attr_setscope( pthread_attr_t*, int scope );
                参数:
                        attr               线程属性变量
                        scope         线程的作用域       
                若成功返回0,若失败返回-1。
               
                作用域控制线程是否在进程内或在系统级上竞争资源,可能的值是
                PTHREAD_SCOPE_PROCESS(进程内竞争资源)
                PTHREAD_SCOPE_SYSTEM   (系统级竞争资源)。
                       
    4.    线程堆栈的大小
               
                函数pthread_attr_setstackaddr和pthread_attr_getstackaddr分别用来设置和得
                到线程堆栈的位置。
               
                int pthread_attr_getstacksize(const pthread_attr_t *,size_t * stacksize);
                int pthread_attr_setstacksize(pthread_attr_t *attr ,size_t *stacksize);
                参数:attr                线程属性变量
                        stacksize        堆栈大小
                若成功返回0,若失败返回-1。           
           
    5.    线程堆栈的地址           
               
                #include <pthread.h>
                int pthread_attr_getstackaddr(const pthread_attr_t *attr,void **stackaddf);
                int pthread_attr_setstackaddr(pthread_attr_t *attr,void *stackaddr);
                参数:attr               线程属性变量
                        stackaddr     堆栈地址           
                若成功返回0,若失败返回-1。
               
                注意:pthread_attr_getstackaddr已经过期,现在使用的是:pthread_attr_getstack

    6.    警戒缓冲区
               
                函数pthread_attr_getguardsize和pthread_attr_setguardsize分别用来设置和得
                到线程栈末尾的警戒缓冲区大小。

                #include <pthread.h>                   
                int pthread_attr_getguardsize(const pthread_attr_t *restrict attr,size_t *restrict
                guardsize);
                int pthread_attr_setguardsize(pthread_attr_t *attr ,size_t *guardsize);
                若成功返回0,若失败返回-1。
               
                值得注意:
                            线程属性guardsize控制着线程栈末尾之后以避免栈溢出的扩展内存
                            大小。这个属性默认设置为PAGESIZE个字节。可以把guardsize线
                            程属性设为0,从而不允许属性的这种特征行为发生:在这种情况
                            下不会提供警戒缓存区。同样地,如果对线程属性stackaddr作了
                            修改,系统就会认为我们会自己管理栈,并使警戒栈缓冲区机制无
                            效,等同于把guardsize线程属性设为0。
  • 相关阅读:
    Atitit.随时间变色特效 ---包厢管理系统的规划
    Atitit.request http乱码的设计防止 检测与解决最近实践p825 attilax总结.doc
    Atitit.request http乱码的设计防止 检测与解决最近实践p825 attilax总结.doc
    atitit.薄伽梵歌overview  attilax 读后感
    Atitit。 《吠陀》 《梨俱吠陀》overview 经读后感  是印度上古时期一些文献的总称
    Atitit。 《吠陀》 《梨俱吠陀》overview 经读后感  是印度上古时期一些文献的总称
    atitit.薄伽梵歌overview  attilax 读后感
    Atitit 《摩奴法典》overivew 读后感 不是由国王 颁布的,而是 僧侣编制
    Atitit 《摩奴法典》overivew 读后感 不是由国王 颁布的,而是 僧侣编制
    Atitit.执行cli cmd的原理与调试
  • 原文地址:https://www.cnblogs.com/jacklikedogs/p/4030048.html
Copyright © 2011-2022 走看看