我创建了两个线程。默认情况下,它们具有 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 到 SCHED_RR 的 99 的限制内。

最佳答案

免责声明:我不是 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

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

关于c++ - 为线程设置新的优先级时不允许操作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10704983/

10-13 08:07