我刚开始使用pthreads并且对此并不了解。我试图使用pthread_setschedprio()设置pthreads的优先级,但它返回“EINVAL”。这是我的代码:
#include <pthread.h>
#include <errno.h>
void *Run(void *ptr);
class Thread {
public:
pthread_t myPthread;
void start() {
pthread_create( &myPthread, NULL, Run, (void*)this );
}
Thread() { }
virtual void run() = 0;
};
void *Run( void *ptr ) {
Thread* tmp;
tmp = (Thread*)ptr;
tmp->run();
}
class MyThread : public Thread {
public:
virtual void run() {
while (1) {
printf("Running\n");
sleep(1);
}
}
};
MyThread t1;
int main()
{
int status;
t1.start();
status= pthread_setschedprio(t1.myPthread, 300);
if(status!=0)
{
if(status==EPERM)
{
fprintf(stderr,"EPERM\n");
}
else if(status==EINVAL)
{
fprintf(stderr,"EINVAL\n");
}
else
{
fprintf(stderr,"neither EPERM nor EINVAL\n");
}
fprintf(stderr,"error %d\n",status);
errno=status;
perror("");
exit(1);
}
pthread_join( t1.myPthread, NULL);
exit(0);
}
当我尝试编译它时,我明白了 EINVAL 运行 错误22 参数无效
有人可以告诉我为什么会收到错误以及如何解决错误吗?
答案 0 :(得分:4)
从this链接看起来,这意味着您指定的优先级对于当前的调度策略无效。如果查看this页面,您可以确定不同调度策略的有效优先级。最后,如果您不确定,可以使用pthread_getschedparam来确定您正在使用的当前调度策略。
答案 1 :(得分:1)
Linux的优先级通常为0-139。实时优先级范围为0-99,动态优先级范围为-19-20(但实际上为100-139)。
负PR值是procps工具显示实时线程的方式。 在这种情况下,由于使用了超出范围的优先级300,因此发生错误。
线程具有调度策略和优先级,传递的参数将与策略一起解释。
sched.h实际上将不同类型的策略定义为
#define SCHED_OTHER 0
#define SCHED_FIFO 1
#define SCHED_RR 2
pthread_create默认在SCHED_OTHER策略中创建线程,这就是你观察到零的原因。
如果我们需要更改FIFO或RR(循环)实时线程的优先级,则需要超级用户权限。