如何降低C / C ++中的线程优先级

时间:2019-07-09 18:01:15

标签: c++ c linux multithreading pthreads

我想降低线程的优先级。

我的线程的默认策略是SCHED_OTHER,并且在我的系统(Ubuntu)下的优先级范围是[0,0](我通过sched_get_priority_min(SCHED_OTHER)sched_get_priority_max(SCHED_OTHER)得到了范围),这意味着所有带有SCHED_OTHER的线程将具有相同的优先级。

有没有办法降低SCHED_OTHER的优先级?我搜索了一段时间,发现了nice值系统,但是不确定man page的正确值,因为{{3}}说好的值是用于进程而不是线程的,我很困惑...

任何人都可以给出正确的解决方案来做到这一点,也许有一段简短的代码片段?谢谢!

已添加

为什么要降低线程的优先级:

我有一个工作线程,该线程会定期执行一些密集的计算(例如,每分钟几秒钟,因此会导致CPU使用率达到峰值),并且我的整个系统会定期降低性能。但是此工作线程的优先级较低,只要它可以在下一分钟之前完成计算,就可以了。因此我想在此时间范围内平稳地分摊此任务的计算。

2 个答案:

答案 0 :(得分:1)

实际上,在Linux上具有调度优先级的情况在适用于进程还是线程的问题上造成了极大的混乱。在规范级别,nicesetpriority适用于进程,但是Linux实际上并不支持这样做,因此它会将参数解释为内核级线程ID(与{{1 }},并且没有标准的用户空间API来请求线程的内核级tid!)。

您可能可以通过pthread_tSCHED_IDLE来实现自己想要的功能,但是它们也不能正常工作。

答案 1 :(得分:1)

假设您运行的是Linux内核的较新版本,则可以尝试将线程设置为SCHED_IDLE,如this link所示,即:

void set_idle_priority() {                                              
   struct sched_param param;
   param.sched_priority = 0;
   if (pthread_setschedparam(pthread_self(), SCHED_IDLE, &m) != 0)
      perror("pthread_setschedparam");
} 

在那种模式下,只有当系统中没有其他要运行的线程时,线程才会运行。

...也就是说,我不确定这样做是否能真正解决您的问题,因为从您的描述开始,您根本不应该遇到该问题。特别是,存在以正常/默认优先级运行的CPU占用线程不会显着降低系统的速度,因为调度程序应自动检测其CPU占用特性并隐式取消其优先级,而无需采取任何特殊步骤。这使我认为您的问题可能不是线程的CPU使用率,而是其他问题,例如您的线程可能耗尽了系统的所有可用RAM容量,从而导致系统不得不将内存分页到磁盘。这肯定会导致系统大大降低速度。另一种可能性是,如果您的线程正在执行大量磁盘I / O(尽管似乎不太可能,因为在那种情况下,它可能不会固定CPU内核)。

您可以尝试使用琐碎的CPU刻录循环临时替换线程的计算,例如:

void my_thread_entry_func()
{
   while(1) {/* empty */}
}

...并运行该命令,以查看是否还会引起速度下降。如果不是,则不是导致CPU使用率降低的原因,而是线程正在执行的其他操作,您将需要做进一步的测试以缩小线程执行路径的哪一部分是罪魁祸首。