zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    MVC项目发布IIS CSS无法加载
    加班理由总结
    查找SQL Server 自增ID值不连续记录
    MySQL按时间查找
    近期任务
    AngularJs使用过程中,在ng-repeat中使用track by
    Java保留字和关键字
    抽象类和接口的区别
    Java标识符
    Java方法重载
  • 原文地址:https://www.cnblogs.com/zsychanpin/p/7122561.html
Copyright © 2011-2022 走看看