【问题标题】:Setting scheduling policy SCHED_IDLE or SCHED_BATCH fails with EINVAL (22)设置调度策略 SCHED_IDLE 或 SCHED_BATCH 失败并显示 EINVAL (22)
【发布时间】: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)

【问题讨论】:

    标签: c linux pthreads


    【解决方案1】:

    实现pthread_attr_setschedpolicy()currently rejects the non-POSIX-defined scheduler policies的glibc代码。

    不过,一旦使用pthread_setschedparam() 运行,您可以将线程的调度程序策略设置为SCHED_IDLESCHED_BATCH。例如。新线程做的第一件事就是设置自己的调度策略。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-15
      • 1970-01-01
      • 2012-11-23
      • 2011-04-29
      • 1970-01-01
      • 1970-01-01
      • 2018-11-14
      • 1970-01-01
      相关资源
      最近更新 更多