1
我想创建不太可能安排的线程(这是为了测试用例,而不是生产代码),所以我想创建一个线程与SCHED_IDLE
调度政策。设置调度策略SCHED_IDLE或SCHED_BATCH失败EINVAL(22)
不幸的是,在我尝试过的每个发行版/内核版本上,这失败了EINVAL
(即使以root身份运行)。
请注意,调用pthread_attr_setschedpolicy()
时失败,但通常失败的是创建具有非授权调度策略的线程(例如,如果您尝试使用非root用户SCHED_RR
)。
这是一些代码在于向世人证明问题:
#define _GNU_SOURCE
#include <assert.h>
#include <errno.h>
#include <pthread.h>
#include <stdio.h>
#include <string.h>
typedef struct
{
const char *name;
int value;
} policy_t;
policy_t policies[] = {
{ "SCHED_OTHER", SCHED_OTHER },
{ "SCHED_IDLE", SCHED_IDLE },
{ "SCHED_BATCH", SCHED_BATCH },
{ "SCHED_FIFO", SCHED_FIFO },
{ "SCHED_RR", SCHED_RR },
};
int main(int argc, char *argv[])
{
for (int i = 0; i < sizeof(policies)/sizeof(policies[0]); i++) {
policy_t policy = policies[i];
pthread_attr_t attr;
pthread_attr_init(&attr);
int e = pthread_attr_setinheritsched(&attr, PTHREAD_EXPLICIT_SCHED);
assert(e == 0);
e = pthread_attr_setschedpolicy(&attr, policy.value);
if (e != 0)
printf("Cannot set sched policy %s (%d): %s (%d)\n",
policy.name,
policy.value,
strerror(e),
e);
}
return 0;
}
我得到的输出是:
Cannot set sched policy SCHED_IDLE (5): Invalid argument (22)
Cannot set sched policy SCHED_BATCH (3): Invalid argument (22)