为线程设置新优先级时不允许操作
operation not permitted while setting new priority for thread
我创建了两个线程。默认情况下,它们的优先级为 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
的限制范围内,以99
SCHED_RR。
免责声明:我不是 Linux 安全方面的专家,以下建议可能会危及或损坏您的计算机。
在最新版本的 Linux 中,有一个资源限制,RLIMIT_RTPRIO
,它指定您可以使用的最大实时优先级。您可以从外壳中检查这一点:
> ulimit -r
0
在我的 Ubuntu 版本(可能还有你的版本(上,还有一个硬性限制为零,所以你不能简单地使用 ulimit
或setrlimit
来提高这个限制。提高硬限制的一种方法是像这样在/etc/security/limits.conf
中添加一行(将<username>
替换为您的用户名(:
<username> hard rtprio 99
然后你应该能够使用ulimit
(从shell(或setrlimit
(从你的程序(将软限制设置为你需要的优先级;或者,你可以通过添加第二行来自动设置limits.conf
,用soft
替换hard
。
> ulimit -Hr # show hard limit
99
> ulimit -r
0
> ulimit -Sr 1 # set soft limit
> ulimit -r
1
小心运行具有实时优先级的程序;如果系统开始行为不端,它可能会杀死系统。
有关说明,请参阅本文。
默认情况下,Linux 中的用户任务具有调度策略SCHED_OTHER
。 为了将其更改为实时策略(即 SCHED_RR
正如你试图做的那样(,你需要成为根。 您可以尝试以 root 身份运行程序来验证这一点。
(另请注意,这篇文章有点过时了 - Linux 2.2。 您可能想对此进行研究,以查看行为在较新的内核中是否发生了变化(
你可以试试SCHED_BATCH
吗?
以上可能不需要根权限
如果您是 root 用户并在 rlimits 内工作,则此调用失败的另一个原因是 cgroups,请参阅:https://unix.stackexchange.com/a/511261/232485
- 为什么 Clang 不允许"and"作为函数名称?
- 不允许在向量中添加更多元素
- std::带有自定义缓冲区的 iostream 不允许我写入
- Visual Studio 2017 不允许我创建 C++ 专用模板
- 返回时不允许隐式转换
- 为什么 c++(g++) 不允许模板返回类型和函数名称之间有空格?
- 为什么 c++ 不允许(自动)强制转换?
- 为什么 c++11 不允许使用自动
- 为什么不允许成员函数和非成员函数之间的函数重载?
- 不确定的std::system_error:what():不允许操作
- 当对象的当前状态不允许在其上进行操作时,要投掷哪个例外
- Qt 创建者,跟踪:不允许操作.什么是永久解决方案
- 什么会导致罕见的 lchown() 失败:不允许操作
- 为线程设置新优先级时不允许操作
- glm::vec2 不允许操作
- 如果 ssl::stream<tcp::socket 有挂起的操作,我是否不允许删除它>?
- 奇怪的异常抛出分配:不允许操作
- Qt数组中的C++不允许传入或操作值
- 谷歌核心转储程序返回不允许的操作
- 启用多线程来使用std::thread:不允许操作