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

问题描述 投票:0回答:4

我创建了两个线程。默认情况下,它们的优先级为

0
我可以看到使用
pthread_getschedparam
,然后我尝试提高他们的优先级,分别说
2
3
。但是当我尝试这样做时,我收到错误

     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 的

1
99
的范围内。

c++ pthreads posix thread-priority
4个回答
20
投票

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

在最新版本的 Linux 中,存在资源限制

RLIMIT_RTPRIO
,它指定可以使用的最大实时优先级。您可以从 shell 中检查这一点:

> ulimit -r
0

在我的 Ubuntu 版本(可能也是你的)上,也有一个零的硬限制,所以你不能简单地使用

ulimit
setrlimit
来提高这个值。提高硬限制的一种方法是向
/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

运行实时优先的程序要小心;如果系统开始出现异常,它可能会杀死系统。


2
投票

请参阅本文了解解释。

默认情况下,Linux 中的用户任务具有调度策略

SCHED_OTHER
。为了将其更改为实时策略(即
SCHED_RR
正如您尝试做的那样),您需要成为 root。您可以尝试以 root 身份运行您的程序来验证这一点。

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


0
投票

你可以尝试使用

SCHED_BATCH
吗?

以上可能不需要root权限


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.