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

operation not permitted while setting new priority for thread

本文关键字:不允许 操作 优先级 线程 设置      更新时间:2023-10-16

我创建了两个线程。默认情况下,它们的优先级为 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;
  }

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

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

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

> ulimit -r
0

在我的 Ubuntu 版本(可能还有你的版本(上,还有一个硬性限制为零,所以你不能简单地使用 ulimitsetrlimit来提高这个限制。提高硬限制的一种方法是像这样在/etc/security/limits.conf中添加一行(将<username>替换为您的用户名(:

<username> hard rtprio 99

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

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

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

有关说明,请参阅本文。

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

(另请注意,这篇文章有点过时了 - Linux 2.2。 您可能想对此进行研究,以查看行为在较新的内核中是否发生了变化(

你可以试试SCHED_BATCH吗?

以上可能不需要根权限

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