gpt4 book ai didi

c - 设置调度策略 SCHED_IDLE 或 SCHED_BATCH 失败并返回 EINVAL (22)

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:40:37 29 4
gpt4 key购买 nike

我正在尝试创建不太可能被安排的线程(这是针对测试用例,而不是生产代码),所以我想创建一个带有 SCHED_IDLE 的线程调度策略。

不幸的是,这失败了 EINVAL (即使以 root 身份运行)在我尝试过的每个发行版/内核版本上。

请注意,调用 pthread_attr_setschedpolicy() 时会失败, 而通常失败的是创建一个线程具有非授权的调度策略(例如,如果您尝试使用 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)

最佳答案

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

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

关于c - 设置调度策略 SCHED_IDLE 或 SCHED_BATCH 失败并返回 EINVAL (22),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43167963/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com