我创建了两个主题。默认情况下,他们可以使用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
的范围内。
答案 0 :(得分:5)
免责声明:我不是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
小心运行具有实时优先级的程序;如果它开始行为不端就会杀死它。
答案 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