【发布时间】:2017-04-02 11:47:55
【问题描述】:
我正在尝试创建不太可能被调度的线程(这是针对测试用例,而不是生产代码),所以我想创建一个具有SCHED_IDLE 调度策略的线程。
不幸的是,在我尝试的每个发行版/内核版本上,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)
【问题讨论】: