C++ 在linux中更改线程优先级和调度程序

C++ 在linux中更改线程优先级和调度程序,c++,c,linux,pthreads,C++,C,Linux,Pthreads,我有一个单线程应用程序。如果我使用下面的代码,我会得到sched_setscheduler():不允许操作 但是,如果我使用下面这样的pthreadapi,我不会得到一个错误。对于单线程应用程序,这两者之间的区别是什么?下面的函数是否真的更改了调度程序和优先级,还是缺少一些错误处理 void assignRRPriority(int tPriority) { int policy; struct sched_param param; pthread_getsched

我有一个单线程应用程序。如果我使用下面的代码,我会得到
sched_setscheduler():不允许操作

但是,如果我使用下面这样的pthreadapi,我不会得到一个错误。对于单线程应用程序,这两者之间的区别是什么?下面的函数是否真的更改了调度程序和优先级,还是缺少一些错误处理

void assignRRPriority(int tPriority)
{
    int  policy;
    struct sched_param param;

    pthread_getschedparam(pthread_self(), &policy, &param);
    param.sched_priority = tPriority;
    if(pthread_setschedparam(pthread_self(), SCHED_RR, &param))
            printf("error while setting thread priority to %d", tPriority);
}

该错误可能是由实时优先级设置的限制引起的(
ulimit-r
用于检查,
ulimit-r 99
用于允许1-99个优先级)。从
pthread_setschedparam
成功开始:如果编译时没有
-pthread
选项,则此函数与其他pthread函数一样,只是一个存根。使用
-pthread
选项,结果应该相同(
strace
显示使用了相同的系统调用)。

您缺少一些基本的错误处理。你需要一些钱。试试这个:

if(pthread_setschedparam(pthread_self(), SCHED_RR, &param) < 0) {
  perror("pthread_setschedparam");
}
if(pthread_setschedparam(pthread_self(),SCHED_RR,¶m)<0){
perror(“pthread_setschedparam”);
}

1。我确实用-lpthread链接了应用程序。2.ulimit-r显示0。那么它如何解释我能够调用值为80的函数assignRRPriority呢。为什么没有出错?
-lpthread
不够,需要
-pthread
(编译和链接都需要)。然后,分配优先级将失败。
if(pthread_setschedparam(pthread_self(), SCHED_RR, &param) < 0) {
  perror("pthread_setschedparam");
}