pthread_setschedprio()失败并显示“EINVAL”

时间:2010-06-29 12:17:58

标签: c++ pthreads

我刚开始使用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 参数无效

有人可以告诉我为什么会收到错误以及如何解决错误吗?

2 个答案:

答案 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(循环)实时线程的优先级,则需要超级用户权限。