我们知道现代操作系统一般都支持多线程,线程是操作系统调度的基本单位,进程是操作系统分派资源的基本单位,所以对线程属性的掌握也十分重要,首先让我们来看看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)非分离状态:创建的默认属性就是非分离状态,在这种状态下,原有线程等待创建线程结束,只有原有进程调用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);
这个主题已经在我的博客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;