pthread_setschedparam 子例程

用途

设置线程的 schedpolicyschedparam 属性。

线程库 (libpthreads.a)

语法

#include <pthread.h>
#include <sys/sched.h>

int pthread_setschedparam (thread, schedpolicy, schedparam)
pthread_t thread;
int schedpolicy;
const struct sched_param *schedparam;

描述

pthread_setschedparam 子例程动态设置线程 thread的 schedpolicy 和 schedparam 属性。 schedpolicy 属性指定线程的调度策略。 schedparam 属性指定使用此属性对象创建的线程的调度参数。 sched_param 结构的 sched_priority 字段包含线程的优先级。 它是整数值。

如果目标线程具有系统争用作用域,那么进程必须具有 root 用户权限才能将调度策略设置为 SCHED_FIFOSCHED_RR

注: pthread.h 头文件必须是使用线程库的每个源文件的第一个包含文件。 否则,应使用 -D_THREAD_SAFE 编译标志或使用 cc_r 编译器。 在这种情况下,会自动设置标志。

此子例程是基本操作系统 (BOS) 运行时的一部分。 此子例程的实现取决于优先级调度 POSIX 选项。 优先级调度 POSIX 选项在操作系统中实现。

参数

表 1. 参数
描述
线程 指定目标线程。
schedpolicy 指向要设置的 schedpolicy 属性。 它必须具有下列其中一个值:
SCHED_FIFO
表示先进先出调度。
SCHED_RR
表示循环调度。
SCHED_OTHER
表示缺省操作系统调度策略。 这是缺省值。 如果 schedpolicy 为 SCHED_OTHER ,那么 sched_priority 必须在 40 到 80 范围内,其中 40 是最不青睐的优先级, 80 是最青睐的优先级。
注: 具有进程争用作用域和 SCHED_OTHER 策略的线程的优先级由内核控制; 因此,设置此类线程的优先级没有任何影响。 但是,可以修改具有系统争用作用域和 SCHED_OTHER 策略的线程的优先级。 修改将直接影响底层内核线程 nice 值。
schedparam 指向要设置的调度参数的存储位置。 sched_priority 字段必须在从 1 到 127 的范围内,其中 1 是最不青睐的优先级,而 127 是最青睐的优先级。 如果 schedpolicy 为 SCHED_OTHER ,那么 sched_priority 必须在 40 到 80 的范围内,其中 40 是最不青睐的优先级, 80 是最青睐的优先级。

用户可以在将其调度策略设置为 SCHED_OTHER 时更改线程的优先级。 可传递到 pthread_setschedparam 的合法值的范围为 40 到 80。 只有特权用户才能设置高于 60 的优先级。 从 1 到 39 的值提供与 40 相同的优先级,而从 81 到 127 的值提供与 80 相同的优先级。

返回值

成功完成后,将返回 0。 否则,将返回错误代码。

错误代码

如果满足以下条件,那么 pthread_setschedparam 子例程将失败:

表 2。 错误代码
描述
EINVAL threadschedparam 参数无效。
ENOSYS 未实现优先级调度 POSIX 选项。
ENOTSUP schedpolicy 或 schedparam 属性的值不受支持。
EPERM 目标线程没有足够的许可权来执行操作或已参与互斥协议。
ESRCH 线程 thread 不存在。