Posix多线程编程—线程属性

上传人:飞*** 文档编号:4823706 上传时间:2017-08-26 格式:DOC 页数:10 大小:46KB
返回 下载 相关 举报
Posix多线程编程—线程属性_第1页
第1页 / 共10页
Posix多线程编程—线程属性_第2页
第2页 / 共10页
Posix多线程编程—线程属性_第3页
第3页 / 共10页
Posix多线程编程—线程属性_第4页
第4页 / 共10页
Posix多线程编程—线程属性_第5页
第5页 / 共10页
点击查看更多>>
资源描述

《Posix多线程编程—线程属性》由会员分享,可在线阅读,更多相关《Posix多线程编程—线程属性(10页珍藏版)》请在金锄头文库上搜索。

1、Posix 多线程编程线程属性 来源:http:/ pthread_attr_t 表示,在对该结构进行处理之前必须进行初始化,在使用后需要对其去除初始化。我们用 pthread_attr_init 函数对其初始化,用pthread_attr_destroy 对其去除初始化。1名称:pthread_attr_init/pthread_attr_destroy功能:对线程属性初始化/去除初始化头文件:#include 函数原形:int pthread_attr_init(pthread_attr_t *attr);int pthread_attr_destroy(pthread_attr_t *a

2、ttr);参数:Attr 线程属性变量返回值:若成功返回 0,若失败返回-1。调用 pthread_attr_init 之后,pthread_t 结构所包含的内容就是操作系统实现支持的线程所有属性的默认值。如果要去除对 pthread_attr_t 结构的初始化,可以调用 pthread_attr_destroy 函数。如果 pthread_attr_init 实现时为属性对象分配了动态内存空间,pthread_attr_destroy 还会用无效的值初始化属性对象,因此如果经pthread_attr_destroy 去除初始化之后的 pthread_attr_t 结构被 pthread_cr

3、eate 函数调用,将会导致其返回错误。线程属性结构如下:typedef structint 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;每个个属性都对应一些函数对其查看或修

4、改。下面我们分别介绍。二、线程的分离状态线程的分离状态决定一个线程以什么样的方式来终止自己。在默认情况下线程是非分离状态的,这种情况下,原有的线程等待创建的线程结束。只有当 pthread_join()函数返回时,创建的线程才算终止,才能释放自己占用的系统资源。而分离线程不是这样子的,它没有被其他的线程所等待,自己运行结束了,线程也就终止了,马上释放系统资源。程序员应该根据自己的需要,选择适当的分离状态。所以如果我们在创建线程时就知道不需要了解线程的终止状态,则可以 pthread_attr_t 结构中的 detachstate 线程属性,让线程以分离状态启动。2名称:pthread_attr

5、_getdetachstate/pthread_attr_setdetachstate功能:获取/修改线程的分离状态属性头文件:#include 函数原形: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。可以使用 pthread_attr

6、_setdetachstate 函数把线程属性 detachstate 设置为下面的两个合法值之一:设置为 PTHREAD_CREATE_DETACHED,以分离状态启动线程;或者设置为 PTHREAD_CREATE_JOINABLE,正常启动线程。可以使用pthread_attr_getdetachstate 函数获取当前的 datachstate 线程属性。(1) 以分离状态创建线程#include void *child_thread(void *arg)printf(“child thread run!n”);int main(int argc,char *argv )pthread_

7、t tid;pthread_attr_t attr;pthread_attr_init(&attr);pthread_attr_setdetachstate(&attr,PTHREAD_CREATE_DETACHED);pthread_create(&tid,&attr,fn,arg);pthread_attr_destroy(&attr);sleep(1);三、线程的继承性函数 pthread_attr_setinheritsched 和 pthread_attr_getinheritsched 分别用来设置和得到线程的继承性,这两个函数的定义如下:3.名称:pthread_attr_get

8、inheritsched /pthread_attr_setinheritsched功能:获得/设置线程的继承性头文件:#include 函数原形: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。这两个函数具有两个参数,第 1 个是指向

9、属性对象的指针,第 2 个是继承性或指向继承性的指针。继承性决定调度的参数是从创建的进程中继承还是使用在 schedpolicy 和schedparam 属性中显式设置的调度信息。Pthreads 不为 inheritsched 指定默认值,因此如果你关心线程的调度策略和参数,必须先设置该属性。继承性的可能值是 PTHREAD_INHERIT_SCHED(表示新现成将继承创建线程的调度策略和参数)和 PTHREAD_EXPLICIT_SCHED(表示使用在 schedpolicy 和schedparam 属性中显式设置的调度策略和参数)。如果你需要显式的设置一个线程的调度策略或参数,那么你必须

10、在设置之前将 inheritsched 属性设置为PTHREAD_EXPLICIT_SCHED.四、线程的调度策略函数 pthread_attr_setschedpolicy 和 pthread_attr_getschedpolicy 分别用来设置和得到线程的调度策略。4.名称:pthread_attr_getschedpolicy pthread_attr_setschedpolicy功能:获得/设置线程的调度策略头文件:#include 函数原形:int pthread_attr_getschedpolicy(const pthread_attr_t *attr,int *policy);

11、int pthread_attr_setschedpolicy(pthread_attr_t *attr,int policy);参数:attr 线程属性变量, policy 调度策略返回值:若成功返回 0,若失败返回-1。这两个函数具有两个参数,第 1 个参数是指向属性对象的指针,第 2 个参数是调度策略或指向调度策略的指针。调度策略可能的值是先进先出(SCHED_FIFO )、轮转法(SCHED_RR),或其它(SCHED_OTHER)。(1) SCHED_FIFO 策略允许一个线程运行直到有更高优先级的线程准备好,或者直到它自愿阻塞自己。在 SCHED_FIFO 调度策略下,当有一个线程

12、准备好时,除非有平等或更高优先级的线程已经在运行,否则它会很快开始执行。(2) SCHED_RR(轮循)策略是基本相同的,不同之处在于:如果有一个 SCHED_RR 策略的线程执行了超过一个固定的时期(时间片间隔) 没有阻塞,而另外的 SCHED_RR 或SCHBD_FIPO 策略的相同优先级的线程准备好时,运行的线程将被抢占以便准备好的线程可以执行。当有 SCHED_FIFO 或 SCHED_RR 策赂的线程在一个条件变量上等持或等持加锁同一个互斥量时,它们将以优先级顺序被唤醒。即,如果一个低优先级的 SCHED_FIFO线程和一个高优先织的 SCHED_FIFO 线程都在等待锁相同的互斥且

13、,则当互斥量被解锁时,高优先级线程将总是被首先解除阻塞。五、线程的调度参数函数 pthread_attr_getschedparam 和 pthread_attr_setschedparam 分别用来设置和得到线程的调度参数。5.名称:pthread_attr_getschedparam pthread_attr_setschedparam功能:获得/设置线程的调度参数头文件:#include 函数原形:int pthread_attr_getschedparam(const pthread_attr_t *attr,struct sched_param *param);int pthread

14、_attr_setschedparam(pthread_attr_t *attr,const struct sched_param *param);参数:attr 线程属性变量, param sched_param 结构返回值:若成功返回 0,若失败返回-1。这两个函数具有两个参数,第 1 个参数是指向属性对象的指针,第 2 个参数是sched_param 结构或指向该结构的指针。结构 sched_param 在文件/usr/include /bits/sched.h 中定义如下:struct sched_paramint sched_priority;结构 sched_param 的子成员

15、sched_priority 控制一个优先权值,大的优先权值对应高的优先权。系统支持的最大和最小优先权值可以用 sched_get_priority_max 函数和sched_get_priority_min 函数分别得到。注意:如果不是编写实时程序,不建议修改线程的优先级。因为,调度策略是一件非常复杂的事情,如果不正确使用会导致程序错误,从而导致死锁等问题。如:在多线程应用程序中为线程设置不同的优先级别,有可能因为共享资源而导致优先级倒置。6.名称:sched_get_priority_max sched_get_priority_min功能:获得系统支持的线程优先权的最大和最小值头文件:#

16、include 函数原形:int sched_get_priority_max(int policy); int sched_get_priority_min(int policy);参数:policy 系统支持的线程优先权的最大和最小值返回值:若成功返回 0,若失败返回-1。 下面是上面几个函数的程序例子:#include #include void *child_thread(void *arg)int policy;int max_priority,min_priority;struct sched_param param;pthread_attr_t attr;pthread_attr_init(&attr); /*初始化线程属性变量*/pthread_attr_setinheritsched(&attr,PTH

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号