我创建了两个线程。默认情况下,它们具有 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;
}
我无法修改线程优先级的原因是什么,因为优先级在
1
到 SCHED_RR 的 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
小心运行具有实时优先级的程序;如果它开始行为不端,它可以杀死系统。
关于c++ - 为线程设置新的优先级时不允许操作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10704983/