Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1482323
  • 博文数量: 181
  • 博客积分: 3308
  • 博客等级: 中校
  • 技术积分: 2227
  • 用 户 组: 普通用户
  • 注册时间: 2010-10-03 12:03
个人简介

我是zoro

文章分类

全部博文(181)

文章存档

2015年(1)

2013年(35)

2012年(39)

2011年(50)

2010年(56)

分类: LINUX

2010-12-01 16:41:12

在linux中,可以使用pthread_attr_t结构修改线程默认属性,并把这些属性与创建的线程联系起来。首先调用pthread_attr_init初始化pthread_attr_t结构,使pthread_attr_t结构所包含的内容就是操作系统实现支持的线程所有属性的默认值。然后,可以调用其他函数对想修改的个别属性进行修改。

1.线程属性的初始化(若对属性操作,必先初始化),去初始化。
     #include
       int pthread_attr_destroy(pthread_attr_t *attr);
       int pthread_attr_init(pthread_attr_t *attr);
       返回值:若成功返回0,否则返回错误编号。

2.获取分离状态/设置分离属性
       #include
       int pthread_attr_getdetachstate(const pthread_attr_t *attr,int *detachstate);
       int pthread_attr_setdetachstate(pthread_attr_t *attr, int detachstate);
       返回值:若成功返回0,否则返回错误编号。
       设置PTHREAD_CREATE_DETACHED,以分离状态启动线程;或设置为PTHREAD_CREATE_JOINABLE,默认正常启动线程,应用程序可以获取线程的终止状态。

3.获取/设置调度策略
       #include
       int pthread_attr_getschedpolicy(const pthread_attr_t *restrict attr,
              int *restrict policy);
       int pthread_attr_setschedpolicy(pthread_attr_t *attr, int policy);
    返回值:若成功返回0,否则返回错误编号。
    The supported values of policy shall include SCHED_FIFO, SCHED_RR,  and SCHED_OTHER,  which  are defined in the header. 
   
POSIX 标准指定了三种调度策略:先入先出策略 (SCHED_FIFO)、循环策略 (SCHED_RR) 和自定义策略 (SCHED_OTHER)。SCHED_FIFO 是基于队列的调度程序,对于每个优先级都会使用不同的队列。SCHED_RR 与 FIFO 相似,不同的是前者的每个线程都有一个执行时间配额。
    SCHED_FIFO
SCHED_RR 是对 POSIX Realtime 的扩展。SCHED_OTHER 是缺省的调度策略。
  • SCHED_FIFO
    如果调用进程具有有效的用户 ID 0,则争用范围为系统 (PTHREAD_SCOPE_SYSTEM) 的先入先出线程属于实时 (RT) 调度类。如果这些线程未被优先级更高的线程抢占,则会继续处理该线程,直到该线程放弃或阻塞为止。对于具有进程争用范围 (PTHREAD_SCOPE_PROCESS)) 的线程或其调用进程没有有效用户 ID 0 的线程,请使用 SCHED_FIFOSCHED_FIFO 基于 TS 调度类。
  • SCHED_RR
    如果调用进程具有有效的用户 ID 0,则争用范围为系统 (PTHREAD_SCOPE_SYSTEM)) 的循环线程属于实时 (RT) 调度类。如果这些线程未被优先级更高的线程抢占,并且这些线程没有放弃或阻塞,则在系统确定的时间段内将一直执行这些线程。对于具有进程争用范围 (PTHREAD_SCOPE_PROCESS) 的线程,请使用 SCHED_RR(基于 TS 调度类)。此外,这些线程的调用进程没有有效的用户 ID 0
     SCHED_FIFOSCHED_RR 在 POSIX 标准中是可选的,而且仅用于实时线程。

4.获取/设置继承的调度策略
       #include
       int pthread_attr_getinheritsched(const pthread_attr_t *restrict attr,int *restrict inheritsched);
       int pthread_attr_setinheritsched(pthread_attr_t *attr,
              int inheritsched);
    pthread_attr_getinheritsched() 成功完成后将返回零。其他任何返回值都表示出现了错误。如果出现以下情况,该函数将失败并返回对应的值。
    EINVAL 描述: 参数 inheritNULLtattr 无效。
   
    pthread_attr_setinheritsched()
成功完成后将返回零。其他任何返回值都表示出现了错误。如果出现以下任一情况,该函数将失败并返回对应的值。
   EINVAL 描述: 尝试将 tattr 设置为无效的值。
   ENOTSUP
描述: 尝试将属性设置为不受支持的值。
   值 PTHREAD_INHERIT_SCHED 表示新建的线程将继承创建者线程中定义的调度策略。将忽略在 pthread_create() 调用中定义的所有调度属性。如果使用缺省值 PTHREAD_EXPLICIT_SCHED,则将使用 pthread_create() 调用中的属性。
5.获取/设置调度参数
       #include
       int pthread_attr_getschedparam(const pthread_attr_t *restrict attr,
              struct sched_param *restrict param);
       int pthread_attr_setschedparam(pthread_attr_t *restrict attr,
              const struct sched_param *restrict param);
  struct sched_param
  {
    int sched_priority;
  };



阅读(1696) | 评论(1) | 转发(1) |
给主人留下些什么吧!~~

chinaunix网友2010-12-03 15:29:08

很好的, 收藏了 推荐一个博客,提供很多免费软件编程电子书下载: http://free-ebooks.appspot.com