设置调度策略SCHED_IDLE或SCHED_BATCH失败,返回EINVAL(22)
我试图创建不太可能被调度的线程(这是针对测试用例,而不是生产代码),因此我想创建一个具有设置调度策略SCHED_IDLE或SCHED_BATCH失败,返回EINVAL(22),c,linux,pthreads,C,Linux,Pthreads,我试图创建不太可能被调度的线程(这是针对测试用例,而不是生产代码),因此我想创建一个具有SCHED_IDLE调度策略的线程 不幸的是,在我尝试的每个发行版/内核版本上,EINVAL(即使以root身份运行)都会失败 请注意,当调用pthread\u attr\u setschedpolicy()时,这会失败,而通常失败的是使用未授权的调度策略创建线程(例如,如果尝试将SCHED\u RR用作非根线程) 下面是一些代码来说明问题: #define _GNU_SOURCE #include <
SCHED_IDLE
调度策略的线程
不幸的是,在我尝试的每个发行版/内核版本上,EINVAL
(即使以root身份运行)都会失败
请注意,当调用pthread\u attr\u setschedpolicy()
时,这会失败,而通常失败的是使用未授权的调度策略创建线程(例如,如果尝试将SCHED\u 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;
}
实现
pthread\u attr\u setschedpolicy()
的glibc代码
但是,在线程运行后,可以使用pthread\u setschedparam()
将其调度程序策略设置为SCHED\u IDLE
或SCHED\u BATCH
。新线程要做的第一件事就是设置自己的调度程序策略
Cannot set sched policy SCHED_IDLE (5): Invalid argument (22)
Cannot set sched policy SCHED_BATCH (3): Invalid argument (22)