Linux线程常见属性小结

我们知道现代操作系统一般都支持多线程,线程是操作系统调度的基本单位,进程是操作系统分派资源的基本单位,所以对线程属性的掌握也十分重要,首先让我们来看看pthread_attr_t这个结构体:

//线程属性结构如下:  
typedef struct  {  
    int                   etachstate;      //线程的分离状态  
    int                   schedpolicy;     //线程调度策略  
    structsched_param     schedparam;      //线程的调度参数  
    int                   inheritsched;    //线程的继承性  
    int                   scope;           //线程的作用域  
    size_t                guardsize;       //线程栈末尾的警戒缓冲区大小  
    int                   stackaddr_set;   //线程的栈设置  
    void*                 stackaddr;       //线程栈的位置  
    size_t                stacksize;       //线程栈的大小  
}pthread_attr_t;

默认情况下新建一个线程属性变量,然后对其修改:


1.线程的分离状态:

这个状态决定了线程以一种什么样的方式来结束自己,一般有两种状态:

(1)非分离状态:创建的默认属性就是非分离状态,在这种状态下,原有线程等待创建线程结束,只有原有进程调用pthread_join()函数时,被创建的进程才能释放自己占有的系统资源。

(2)分离状态:在这种状态下创建的线程没有被其它线程所等待,自己运行结束了,线程就终止并且马上释放掉所占有的资源。下面我们就来看看相关函数:

假设我们创建一个detach线程:

创建 detach 线程:
pthread_t tid;
pthread_attr_t attr;
pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
pthread_create(&tid, &attr, THREAD_FUNCTION, arg);


2.线程的栈地址和栈大小

这个主题已经在我的博客http://blog.csdn.net/caoyan_12727/article/details/52281409讨论过,这里不再赘述!!!下面只列出一些相关函数:

3.线程调度策略:

头文件:
#include <pthread.h>
函数原形:
int pthread_attr_getschedpolicy(const pthread_attr_t *attr,int *policy);
int pthread_attr_setschedpolicy(pthread_attr_t *attr,int policy);
参数:
attr          线程属性变量
policy        调度策略
返回值:
若成功返回0,若失败返回-1。
说明:这两个函数具有两个参数,第1个参数是指向属性对象的指针,第2个参数是调度策略或指向调度策略的指针。调度策略可能的值是 先进先出(SCHED_FIFO)轮转法(SCHED_RR),或其它(SCHED_OTHER)。SCHED_FIFO策略允许一个线程运行直到有更高优先级的线程准备好,或者直到它自愿阻塞自己。在SCHED_FIFO调度策略下,当有一个线程准备好时,除非有平等或更高优先级的线程已经在运行,否则它会很快开始执行。SCHED_RR(轮循)策略是基本相同的,不同之处在于:如果有一个SCHED_RR策略的线程执行了超过一个固定的时期(时间片间隔)没有阻塞,而另外的SCHED_RR或SCHBD_FIPO策略的相同优先级的线程准备好时,运行的线程将被抢占以便准备好的线程可以执行。当有SCHED_FIFO或SCHED_RR策赂的线程在一个条件变量上等待或等待加锁同一个互斥量时,它们将以优先级顺序被唤醒。即,如果一个低优先级的SCHED_FIFO线程和一个高优先织的SCHED_FIFO线程都在等待相同的互斥锁,则当互斥量被解锁时,高优先级线程将总是首先被解除阻塞。

4.线程栈末尾缓冲区大小:

名称:

pthread_attr_getguardsize

pthread_attr_setguardsize

功能:

获得/修改线程栈末尾的警戒缓冲区大小

头文件:

#include

函数原形:

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);

参数:

 attr线程属性, guardsize警戒缓冲区的大小

返回值:

若成功返回0,若失败返回-1

线程属性guardsizei控制着线程栈末尾之后用以避免栈溢出的扩展内存的大小,这个属性默认值是有具体定义来实现的,但常用值是系统页大小。可以把guardsize线程属性设置为0,不允许属性的这种行为发生;在这种情况下,不会提供警戒缓冲区。同样,如果修改了线程属性stackaddr,系统会认为我们自己管理堆栈,进而使栈警戒缓冲区机制无效,这等同于吧guardsize线程属性设置为0;


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值