POSIX线程优先级设置

POSIX线程优先级的修改方式有静态修改、动态修改。

  • 静态修改:在线程启动前设置初始值,即修改线程属性块的值。
  • 动态修改:在线程启动后动态修改,通过posix调度函数进行动态修改。

静态修改:

在调用 pthread_create 函数创建启动线程之前,调用 pthread_attr_init 函数初始化一个线程属性对象

#include <pthread.h>
int pthread_attr_init(pthread_attr_t *pattr);

同时posix提供了一系列函数用于 获取/设置 线程属性对象各成员的值,函数的 pthread_attr_getschedparam 输入参数 pschedparam 结构体中含有存储优先级的成员变量,调用 pthread_attr_setschedparam 函数可以设置线程属性对象的调度参数,调用 pthread_attr_getschedparam 函数将获得线程属性对象的调度参数。函数定义如下图:

#include <pthread.h>
int pthread_attr_setschedparam(pthread_attr_t *pattr, const struct sched_param *pschedparam);
int pthread_attr_getschedparam(const pthread_attr_t *pattr,  struct sched_param *pschedparam);

动态修改:

进程(主线程):

posix提供了一系列线程调度函数用于动态修改线程属性,其中 sched_setscheduler 函数提供了一种动态改变线程优先级的方法。调用 sched_setscheduler 函数在设置调度策略的同时也设置了进程优先级,输入参数 pschedparam 结构体中含有存储优先级的成员变量。

#include <sched.h>
int sched_setscheduler(pid_t pid, int iPolicy, const struct sched_param *pschedparam);

也可以通过调用 sched_setparam 函数来设置进程的优先级,输入参数 pschedparam 结构体中含有存储优先级的成员变量。

#include <sched.h>
int sched_setparam(pid_t pid, const struct sched_param *pschedparam);

设置满足条件的所有线程的 SylixOS 调度优先级。  

#include <sys/resource.h>
int setpriority(int which, id_t who, int value);
函数 setpriority 原型分析:
  • 此函数成功时返回 0,失败时返回-1 并设置错误号;
  • 参数 which 指定参数 who 的意义;
  • 参数 who 的意义由参数 which 指定,如下图所示:
  • 参数 value 是要设置的优先级值。

进程(主线程):

nice 函数可以调整当前进程优先级。

#include <unistd.h>
int nice(int incr);

函数 nice 原型分析:

  • 此函数成功返回 0,失败返回-1 并设置错误号;
  • 参数 incr 是要调整的数值。本函数对 incr 参数的处理流程如下:

(1) 首先获取当前进程中所有线程中的最低优先级,即数值最大的的优先级;

(2) 然后将获取到的值和 incr 参数求和;

(3) 将上一步求和的结果设置到当前进程的所有线程中。

POSIX也提供了相关函数 pthread_setschedprio 用于动态修改当前进程优先级,但 pthread_getschedprio 不属于posix 定义范围,SylixOS也给出了实现。

#include <pthread.h>

int pthread_setschedprio(pthread_t thread, int prio);
int pthread_getschedprio(pthread_t thread, int *prio);

函数 pthread_setschedprio 原型分析:

  • 此函数成功返回 0,失败返回-1 并设置错误号;
  • 参数 thread 是要调整的线程id。
  • 参数 prio 是需要设置的线程优先级的数值。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值