7

我创建了两个线程。默认情况下,他们有一个优先级,我可以使用 pthread_getschedparam 看到,然后0我尝试分别提高他们的优先级。但是当我尝试这样做时,我得到了一个错误23

     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 的限制范围199

4

4 回答 4

12

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

在最近的 Linux 版本中,有一个资源限制 ,RLIMIT_RTPRIO它指定了您可以使用的最大实时优先级。您可以从外壳检查:

> ulimit -r
0

在我的 Ubuntu 版本(可能还有你的版本)上,硬限制也为零,所以你不能简单地使用ulimitsetrlimit提高它。提高硬限制的一种方法是添加一行/etc/security/limits.conf这样(替换<username>为您的用户名):

<username> hard rtprio 99

然后您应该能够使用ulimit(从外壳程序)或setrlimit(从您的程序)将软限制设置为您需要的优先级;或者,您可以通过添加第二行来自动设置它limits.conf,替换hardsoft.

> ulimit -Hr # show hard limit
99
> ulimit -r
0
> ulimit -Sr 1 # set soft limit
> ulimit -r
1

小心运行具有实时优先级的程序;如果它开始行为不端,它可能会杀死系统。

于 2012-05-22T16:03:26.207 回答
2

请参阅这篇文章以获得解释。

默认情况下,Linux 中的用户任务具有调度策略SCHED_OTHER。为了将其更改为实时策略(即SCHED_RR,正如您尝试做的那样),您需要成为 root。您可以尝试以 root 身份运行您的程序来验证这一点。

(还要注意这篇文章有点过时了——Linux 2.2。你可能想研究一下这个行为是否在较新的内核中发生了变化)

于 2012-05-22T15:33:42.227 回答
0

你可以试试SCHED_BATCH吗?

以上可能不需要root权限

于 2012-05-22T15:31:00.850 回答
0

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

于 2019-06-13T14:34:39.833 回答