使用EINVAL(22)设置调度策略SCHED_IDLE或SCHED_BATCH失败

时间:2017-04-02 11:47:56

标签: c linux pthreads

我正在尝试创建不太可能被调度的线程(这是针对测试用例,而不是生产代码),所以我想创建一个具有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)

1 个答案:

答案 0 :(得分:1)

实现pthread_attr_setschedpolicy() currently rejects the non-POSIX-defined scheduler policies

的glibc代码

但是,您可以使用SCHED_IDLE将线程的调度程序策略设置为SCHED_BATCHpthread_setschedparam()。例如。新线程的第一件事就是设置自己的调度程序策略。

相关问题