Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
设置调度策略SCHED_IDLE或SCHED_BATCH失败,返回EINVAL(22)_C_Linux_Pthreads - Fatal编程技术网

设置调度策略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)