2017-04-02 62 views
1

我想创建不太可能安排的线程(这是为了测试用例,而不是生产代码),所以我想创建一个线程与SCHED_IDLE调度政策。设置调度策略SCHED_IDLE或SCHED_BATCH失败EINVAL(22)

不幸的是,在我尝试过的每个发行版/内核版本上,这失败了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) 

回答

1

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

尽管如此,您可以使用pthread_setschedparam()将线程的调度程序策略设置为SCHED_IDLESCHED_BATCH。例如。新线程所做的第一件事情可能是设置自己的调度程序策略。