- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在尝试创建不太可能被安排的线程(这是针对测试用例,而不是生产代码),所以我想创建一个带有 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_IDLE
或 SCHED_BATCH
。例如。新线程做的第一件事可能是设置自己的调度程序策略。
关于c - 设置调度策略 SCHED_IDLE 或 SCHED_BATCH 失败并返回 EINVAL (22),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43167963/
我正在尝试在没有优先级继承互斥锁的情况下使用 SCHED_IDLE 实现无权限的优先级反转测试用例。该测试适用于 SCHED_FIFO 和不同的实时优先级(非 PI 互斥锁死锁,使用 PI 互斥锁立即
我正在尝试使用 sched_setscheduler() 来设置给定进程的调度策略。根据其 man page ,可用标志为 SCHED_FIFO,SCHED_RR,SCHED_OTHER,SCHED_
我正在尝试创建不太可能被安排的线程(这是针对测试用例,而不是生产代码),所以我想创建一个带有 SCHED_IDLE 的线程调度策略。 不幸的是,这失败了 EINVAL (即使以 root 身份运行)在
我是一名优秀的程序员,十分优秀!