名 前
pthread_setschedparam, pthread_getschedparam − ス レ ッ ド の ス ケ ジ ュ ー リ ン グ ポ リ シ ー と パ ラ メ ー タ ー を 設 定 /取 得 す る
書 式
#include <pthread.h>
int
pthread_setschedparam(pthread_t thread,
int policy,
const struct sched_param *param);
int pthread_getschedparam(pthread_t thread,
int *policy,
struct sched_param *param);
−pthread で コ ン パ イ ル し て リ ン ク す る 。
説 明
pthread_setschedparam() 関 数 は 、 ス レ ッ ド thread の ス ケ ジ ュ ー リ ン グ ポ リ シ ー と ス ケ ジ ュ ー リ ン グ パ ラ メ ー タ ー を 設 定 す る 。
policy は thread の 新 し い ス ケ ジ ュ ー リ ン グ ポ リ シ ー を 指 定 す る 。 policy に 指 定 で き る 値 と そ の 意 味 は sched(7) で 説 明 さ れ て い る 。
param が 指 す 構 造 体 は thread の 新 し い ス ケ ジ ュ ー リ ン グ パ ラ メ ー タ ー を 指 定 す る 。 ス ケ ジ ュ ー リ ン グ パ ラ メ ー タ ー は 以 下 の 構 造 体 で 管 理 さ れ る 。
struct
sched_param {
int sched_priority; /* Scheduling priority */ }; 見
て 分 か る 通 り
、 サ ポ ー ト さ
れ て い る ス ケ
ジ ュ ー リ ン グ
パ ラ メ ー タ ー
は 一 つ だ け で
あ る 。 各 ス ケ
ジ ュ ー リ ン グ
ポ リ シ ー で 許
可 さ れ る ス ケ
ジ ュ ー リ ン グ
優 先 度 の 詳 細
に つ い て は 、
sched(7) を 参 照 の こ
と 。
pthread_getschedparam() 関 数 は 、 ス レ ッ ド thread の ス ケ ジ ュ ー リ ン グ ポ リ シ ー と パ ラ メ ー タ ー を 、 そ れ ぞ れ policy と param が 指 す バ ッ フ ァ ー に 入 れ て 返 す 。 返 さ れ た 優 先 度 の 値 は 、 最 も 最 近 実 行 し た thread に 影 響 を 与 え る pthread_setschedparam(), pthread_setschedprio, pthread_create で 設 定 さ れ た 値 と な る 。 返 さ れ た 優 先 度 は 、 優 先 度 の 継 承 や 優 先 度 の 上 限 を 設 定 す る 関 数 (例 え ば pthread_mutexattr_setprioceiling(3) や pthread_mutexattr_setprotocol(3) を 参 照 ) の 呼 び 出 し の 結 果 行 わ れ る 一 時 的 な 優 先 度 の 調 整 の 影 響 を 受 け な い 。
返 り 値
成 功 す る と 、 こ れ ら の 関 数 は 0 を 返 す 。 エ ラ ー の 場 合 、 0 以 外 の エ ラ ー 番 号 を 返 す 。 pthread_setschedparam() が 失 敗 し た 場 合 、 thread の ス ケ ジ ュ ー リ ン グ ポ リ シ ー と パ ラ メ ー タ ー は 変 更 さ れ な い 。
エ ラ ー
こ れ ら の 関 数 は ど ち ら も 以 下 の エ ラ ー で 失 敗 す る 場 合 が あ る 。
ESRCH |
ID が thread の ス レ ッ ド が 見 つ か ら な か っ た 。 |
pthread_setschedparam() は さ ら に 以 下 の エ ラ ー で 失 敗 す る 場 合 が あ る 。
EINVAL |
policy が 認 識 で き な い ポ リ シ ー で あ る か 、 param が policy で は 意 味 を 持 た な い 値 で あ る 。 | ||
EPERM |
呼 び 出 し 側 が 、 指 定 さ れ た ス ケ ジ ュ ー リ ン グ ポ リ シ ー や パ ラ メ ー タ ー を 設 定 す る の に 必 要 な 特 権 を 持 た な い 。
POSIX.1−2001 で は 、 pthread_setschedparam() に 関 し て エ ラ ー ENOTSUP ("サ ポ ー ト さ れ て い な い 値 を ス ケ ジ ュ ー リ ン グ ポ リ シ ー や パ ラ メ ー タ ー に 設 定 し よ う と し た ") も 追 加 で 規 定 さ れ て い る 。 |
属 性
マ ル チ ス レ ッ デ ィ ン グ (pthreads(7) 参 照 ) 関 数 pthread_setschedparam() と pthread_getschedparam() は ス レ ッ ド セ ー フ で あ る 。
準 拠
POSIX.1−2001.
注 意
ス レ ッ ド の ス ケ ジ ュ ー リ ン グ ポ リ シ ー や 優 先 度 を 変 更 す る た め に 必 要 な 許 可 や 変 更 し た 場 合 の 影 響 、 お よ び 各 ス ケ ジ ュ ー リ ン グ ポ リ シ ー で 認 め ら れ る 優 先 度 の 範 囲 の 詳 細 に つ い て は 、 sched(7) を 参 照 。
例
以 下 の プ ロ グ ラ ム は pthread_setschedparam() と pthread_getschedparam() や ス ケ ジ ュ ー リ ン グ に 関 連 す る pthreads の 他 の い ろ い ろ な 関 数 の 使 用 例 を 示 す も の で あ る 。 以 下 の 実 行 例 で は 、 メ イ ン ス レ ッ ド は 、 自 分 の ス ケ ジ ュ ー リ ン グ ポ リ シ ー を 優 先 度 10 の SCHED_FIFO を 設 定 し 、 ス レ ッ ド 属 性 オ ブ ジ ェ ク ト を ス ケ ジ ュ ー リ ン グ ポ リ シ ー 属 性 SCHED_RR と ス ケ ジ ュ ー リ ン グ 優 先 度 属 性 20 で 初 期 化 す る 。 次 に 、 こ の プ ロ グ ラ ム は (pthread_attr_setinheritsched(3) を 使 っ て ) そ の ス レ ッ ド 属 性 オ ブ ジ ェ ク ト の inherit scheduler 属 性 に PTHREAD_EXPLICIT_SCHED を 設 定 す る 。 PTHREAD_EXPLICIT_SCHED は 、 そ の ス レ ッ ド 属 性 オ ブ ジ ェ ク ト を 使 っ て 作 成 さ れ た ス レ ッ ド は ス レ ッ ド 属 性 オ ブ ジ ェ ク ト か ら ス ケ ジ ュ ー リ ン グ 属 性 を 取 得 し て 使 う こ と を 意 味 す る 。 そ れ か ら 、 こ の ス レ ッ ド 属 性 オ ブ ジ ェ ク ト を 使 っ て ス レ ッ ド を 作 成 し 、 作 成 し た ス レ ッ ド の ス ケ ジ ュ ー リ ン グ ポ リ シ ー と 優 先 度 を 表 示 す る 。
$ su #
Need privilege to set real−time scheduling policies
Password:
# ./a.out −mf10 −ar20 −i e
Scheduler settings of main thread
policy=SCHED_FIFO, priority=10
Scheduler
settings in 'attr'
policy=SCHED_RR, priority=20
inheritsched is EXPLICIT
Scheduler
attributes of new thread
policy=SCHED_RR, priority=20 上 記 の
出 力 で は 、 ス
ケ ジ ュ ー リ ン
グ ポ リ シ ー と
優 先 度 が ス レ
ッ ド 属 性 オ ブ
ジ ェ ク ト で 指
定 さ れ た 値 か
ら 取 ら れ て い
る こ と が 分 か
る 。 次 の 実 行
例 は 前 の も の
と 同 じ だ が 、
inherit scheduler 属 性 が
PTHREAD_INHERIT_SCHED に 設 定
さ れ る 点 が 異
な る 。 PTHREAD_INHERIT_SCHED
は 、 そ の ス レ
ッ ド 属 性 オ ブ
ジ ェ ク ト を 使
っ て 作 成 さ れ
た ス レ ッ ド は
、 ス レ ッ ド 属
性 オ ブ ジ ェ ク
ト か ら ス ケ ジ
ュ ー リ ン グ 属
性 を 無 視 し 、
代 わ り に 呼 び
出 し た ス レ ッ
ド か ら ス ケ ジ
ュ ー リ ン グ 属
性 を 取 得 す る
こ と を 意 味 す
る 。
# ./a.out
−mf10 −ar20 −i i
Scheduler settings of main thread
policy=SCHED_FIFO, priority=10
Scheduler
settings in 'attr'
policy=SCHED_RR, priority=20
inheritsched is INHERIT
Scheduler
attributes of new thread
policy=SCHED_FIFO, priority=10 上 記 の
出 力 で は 、 ス
ケ ジ ュ ー リ ン
グ ポ リ シ ー と
優 先 度 が 、 ス
レ ッ ド 属 性 オ
ブ ジ ェ ク ト か
ら で は な く 、
ス レ ッ ド を 作
成 し た ス レ ッ
ド か ら 取 れ れ
て い る こ と が
分 か る 。 な お
、 −i i を 省 略
し た 場 合 で も
、 PTHREAD_INHERIT_SCHED が inherit
scheduler 属 性 の デ フ
ォ ル ト 値 な の
で 、 出 力 は 同
じ に な る 。 プ
ロ グ ラ ム の ソ
ー ス
/* pthreads_sched_test.c */
#include
<pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#define
handle_error_en(en, msg) \
do { errno = en; perror(msg); exit(EXIT_FAILURE); } while
(0)
static void
usage(char *prog_name, char *msg)
{
if (msg != NULL)
fputs(msg, stderr);
fprintf(stderr,
"Usage: %s [options]\n", prog_name);
fprintf(stderr, "Options are:\n");
#define fpe(msg) fprintf(stderr, "\t%s", msg); /*
Shorter */
fpe("−a<policy><prio> Set scheduling
policy and priority in\n");
fpe(" thread attributes object\n");
fpe(" <policy> can be\n");
fpe(" f SCHED_FIFO\n");
fpe(" r SCHED_RR\n");
fpe(" o SCHED_OTHER\n");
fpe("−A Use default thread attributes
object\n");
fpe("−i {e|i} Set inherit scheduler attribute
to\n");
fpe(" 'explicit' or 'inherit'\n");
fpe("−m<policy><prio> Set scheduling
policy and priority on\n");
fpe(" main thread before pthread_create()
call\n");
exit(EXIT_FAILURE); }
static int
get_policy(char p, int *policy)
{
switch (p) {
case 'f': *policy = SCHED_FIFO; return 1;
case 'r': *policy = SCHED_RR; return 1;
case 'o': *policy = SCHED_OTHER; return 1;
default: return 0; } }
static void
display_sched_attr(int policy, struct sched_param *param)
{
printf(" policy=%s, priority=%d\n",
(policy == SCHED_FIFO) ? "SCHED_FIFO" :
(policy == SCHED_RR) ? "SCHED_RR" :
(policy == SCHED_OTHER) ? "SCHED_OTHER" :
"???",
param−>sched_priority); }
static void
display_thread_sched_attr(char *msg)
{
int policy, s;
struct sched_param param;
s =
pthread_getschedparam(pthread_self(), &policy,
¶m);
if (s != 0)
handle_error_en(s, "pthread_getschedparam");
printf("%s\n",
msg);
display_sched_attr(policy, ¶m); }
static void *
thread_start(void *arg)
{
display_thread_sched_attr("Scheduler attributes of new
thread");
return NULL; }
int
main(int argc, char *argv[])
{
int s, opt, inheritsched, use_null_attrib, policy;
pthread_t thread;
pthread_attr_t attr;
pthread_attr_t *attrp;
char *attr_sched_str, *main_sched_str, *inheritsched_str;
struct sched_param param;
/* Process command−line options */
use_null_attrib
= 0;
attr_sched_str = NULL;
main_sched_str = NULL;
inheritsched_str = NULL;
while ((opt =
getopt(argc, argv, "a:Ai:m:")) != −1) {
switch (opt) {
case 'a': attr_sched_str = optarg; break;
case 'A': use_null_attrib = 1; break;
case 'i': inheritsched_str = optarg; break;
case 'm': main_sched_str = optarg; break;
default: usage(argv[0], "Unrecognized option\n");
} }
if
(use_null_attrib &&
(inheritsched_str != NULL || attr_sched_str != NULL))
usage(argv[0], "Can't specify −A with −i or
−a\n");
/* Optionally
set scheduling attributes of main thread,
and display the attributes */
if
(main_sched_str != NULL) {
if (!get_policy(main_sched_str[0], &policy))
usage(argv[0], "Bad policy for main thread
(−m)\n");
param.sched_priority = strtol(&main_sched_str[1], NULL,
0);
s =
pthread_setschedparam(pthread_self(), policy, ¶m);
if (s != 0)
handle_error_en(s, "pthread_setschedparam"); }
display_thread_sched_attr("Scheduler
settings of main thread");
printf("\n");
/* Initialize thread attributes object according to options */
attrp = NULL;
if
(!use_null_attrib) {
s = pthread_attr_init(&attr);
if (s != 0)
handle_error_en(s, "pthread_attr_init");
attrp = &attr; }
if
(inheritsched_str != NULL) {
if (inheritsched_str[0] == 'e')
inheritsched = PTHREAD_EXPLICIT_SCHED;
else if (inheritsched_str[0] == 'i')
inheritsched = PTHREAD_INHERIT_SCHED;
else
usage(argv[0], "Value for −i must be 'e' or
'i'\n");
s =
pthread_attr_setinheritsched(&attr, inheritsched);
if (s != 0)
handle_error_en(s,
"pthread_attr_setinheritsched"); }
if
(attr_sched_str != NULL) {
if (!get_policy(attr_sched_str[0], &policy))
usage(argv[0],
"Bad policy for 'attr' (−a)\n");
param.sched_priority = strtol(&attr_sched_str[1], NULL,
0);
s =
pthread_attr_setschedpolicy(&attr, policy);
if (s != 0)
handle_error_en(s, "pthread_attr_setschedpolicy");
s = pthread_attr_setschedparam(&attr, ¶m);
if (s != 0)
handle_error_en(s, "pthread_attr_setschedparam");
}
/* If we
initialized a thread attributes object, display
the scheduling attributes that were set in the object */
if (attrp !=
NULL) {
s = pthread_attr_getschedparam(&attr, ¶m);
if (s != 0)
handle_error_en(s, "pthread_attr_getschedparam");
s = pthread_attr_getschedpolicy(&attr, &policy);
if (s != 0)
handle_error_en(s,
"pthread_attr_getschedpolicy");
printf("Scheduler
settings in 'attr'\n");
display_sched_attr(policy, ¶m);
s =
pthread_attr_getinheritsched(&attr, &inheritsched);
printf(" inheritsched is %s\n",
(inheritsched == PTHREAD_INHERIT_SCHED) ?
"INHERIT" :
(inheritsched == PTHREAD_EXPLICIT_SCHED) ?
"EXPLICIT" :
"???");
printf("\n"); }
/* Create a thread that will display its scheduling attributes */
s =
pthread_create(&thread, attrp, &thread_start, NULL);
if (s != 0)
handle_error_en(s, "pthread_create");
/* Destroy unneeded thread attributes object */
if
(!use_null_attrib) {
s = pthread_attr_destroy(&attr);
if (s != 0)
handle_error_en(s, "pthread_attr_destroy"); }
s =
pthread_join(thread, NULL);
if (s != 0)
handle_error_en(s, "pthread_join");
exit(EXIT_SUCCESS); }
関 連 項 目
getrlimit(2), sched_get_priority_min(2), pthread_attr_init(3), pthread_attr_setinheritsched(3), pthread_attr_setschedparam(3), pthread_attr_setschedpolicy(3), pthread_create(3), pthread_self(3), pthread_setschedprio(3), pthreads(7), sched(7)
こ の 文 書 に つ い て
こ の man ペ ー ジ は Linux man−pages プ ロ ジ ェ ク ト の リ リ ー ス 3.79 の 一 部 で あ る 。 プ ロ ジ ェ ク ト の 説 明 と バ グ 報 告 に 関 す る 情 報 は http://www.kernel.org/doc/man−pages/ に 書 か れ て い る 。