我创建了两个线程。默认情况下,它们的优先级为
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
的范围内。
免责声明:我不是 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
运行实时优先的程序要小心;如果系统开始出现异常,它可能会杀死系统。
请参阅本文了解解释。
默认情况下,Linux 中的用户任务具有调度策略
SCHED_OTHER
。为了将其更改为实时策略(即 SCHED_RR
正如您尝试做的那样),您需要成为 root。您可以尝试以 root 身份运行您的程序来验证这一点。
(另请注意,这篇文章有点过时了 - Linux 2.2。您可能想研究一下这篇文章,看看新内核中的行为是否发生了变化)
你可以尝试使用
SCHED_BATCH
吗?
以上可能不需要root权限
如果您是root并且在rlimits内工作,则此调用失败的另一个原因是cgroup,请参阅:https://unix.stackexchange.com/a/511261/232485