我正在尝试创建不太可能被调度的线程(这是针对测试用例,而不是生产代码),所以我想创建一个具有SCHED_IDLE
调度策略的线程。
不幸的是,在我尝试的每个发行版/内核版本上,EINVAL
(即使以root用户身份运行)都失败了。
请注意,调用pthread_attr_setschedpolicy()
时失败,而通常失败的是创建具有非授权调度策略的线程(例如,如果您尝试将SCHED_RR
用作非root用户)
这是解决问题的一些代码:
#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)
答案 0 :(得分:1)
实现pthread_attr_setschedpolicy()
currently rejects the non-POSIX-defined scheduler policies。
但是,您可以使用SCHED_IDLE
将线程的调度程序策略设置为SCHED_BATCH
或pthread_setschedparam()
。例如。新线程的第一件事就是设置自己的调度程序策略。