在为线程设置新优先级时不允许操作

时间:2012-05-22 15:18:53

标签: c++ pthreads

我创建了两个主题。默认情况下,他们可以使用0优先级 pthread_getschedparam,然后我尝试将其优先级分别设为23。但是,当我尝试这样做时,我得到一个错误

     error setting priority for T1: (1), Operation not permitted
     error setting priority for T2: (1), Operation not permitted 

我已使用SCHED_RR的调度政策

       int sched = SCHED_RR;

然后执行此操作: -

   if (pthread_setschedparam(t1, sched, &t1_param) != 0) 
  {
     std::cout << "error setting priority for T1: (" << errno << "), " << 
     strerror(errno) << std::endl;
  }

我无法修改线程优先级的原因是什么,因为SCHED_RR的优先级在199的范围内。

4 个答案:

答案 0 :(得分:5)

免责声明:我不是Linux安全专家,以下建议可能会损害或损坏您的计算机。

在最新版本的Linux中,有一个资源限制RLIMIT_RTPRIO,它指定了您可以使用的最大实时优先级。您可以从shell中检查:

> ulimit -r
0

在我的Ubuntu版本(也可能是你的版本)上也存在零限制,所以你不能简单地使用ulimitsetrlimit来提高它。提高硬限额的一种方法是在此/etc/security/limits.conf添加一行(用您的用户名替换<username>):

<username> hard rtprio 99

然后您应该能够使用ulimit(来自shell)或setrlimit(来自您的程序)将软限制设置为您需要的优先级;或者,您可以通过向limits.conf添加第二行来自动设置,将hard替换为soft

> ulimit -Hr # show hard limit
99
> ulimit -r
0
> ulimit -Sr 1 # set soft limit
> ulimit -r
1

小心运行具有实时优先级的程序;如果它开始行为不端就会杀死它。

答案 1 :(得分:1)

请参阅this article以获取解释。

默认情况下,Linux中的用户任务具有调度策略SCHED_OTHER。为了将其更改为实时策略(即您尝试执行的SCHED_RR),您需要是root用户。您可以尝试以root用户身份运行程序来验证这一点。

(另请注意,这篇文章有点过时了 - Linux 2.2。你可能想研究一下,看看新内核中的行为是否发生了变化)

答案 2 :(得分:0)

你可以试试SCHED_BATCH吗?

以上可能不需要root权限

答案 3 :(得分:0)

如果您是root用户并且在rlimits内工作,则此调用失败的另一个原因是cgroups,请参见:https://unix.stackexchange.com/a/511261/232485