使用 pthreads 时的后台线程(很好,优先级)

Posted

技术标签:

【中文标题】使用 pthreads 时的后台线程(很好,优先级)【英文标题】:Background threads when using pthreads (nice, priority) 【发布时间】:2012-12-07 12:08:08 【问题描述】:

我有一个 GUI 应用程序,它使用 pthreads 执行一些繁重的后台处理。

当后台处理正在运行时,GUI 非常无响应,我认为这是因为后台线程正在耗尽 CPU 时间。

在 Windows 上,您可以在后台线程上 ::SetThreadPriority(hThread, THREAD_PRIORITY_BELOW_NORMAL),一切正常。

但是在 Linux 上,我使用的是 pthreads,但我找不到一个好的替代方案。

我已经考虑过了;

::sched_setscheduler(SCHED_FIFO) 或 ::sched_setscheduler(SCHED_RR) - 这是不可行的,因为它需要 root(对我的 GUI 应用程序不好) - 这也会使 GUI 线程有太多的 CPU;我只希望 GUI 优先于后台线程。 ::pthread_setschedparam 但在使用不受支持的 SCHED_FIFO 或 SCHED_RR 以外的任何内容时(::sched_get_priority_min(SCHED_OTHER) 和 ::sched_get_priority_max(SCHED_OTHER) 均返回 0) 拥有多个进程并使用 ::nice。 GUI 和后台线程之间存在太多耦合,无法实现这一点(并且将这么多代码移植到这个设计中是一项主要工作) 使用 ::setpriority 重新调整后台线程。这确实有效 - 但与文档所说的直接背道而驰:PThreads documentation(因此以后可能会在系统范围内“修复”)

我确信这是 GUI 应用程序的常见模式,那么我错过了什么?

马库斯。

编辑:在选项列表中添加 ::setpriority(感谢 ZalewaPL)

【问题讨论】:

"...GUI 和后台线程之间的耦合过多..." 我会开始考虑设计,sry。 我不确定这是否有帮助 - 没有理由在 UI 和后台线程之间没有大量流量,并且不想将其移植到跨进程通信是很合理的。 【参考方案1】:

将后台线程的好值设置为更高的值可能会有所帮助。 参考这个: Nice-Level for pthreads?

【讨论】:

谢谢,我确实考虑过这一点,但文档提到了进程而不是线程。虽然它确实适用于线程(我刚刚对其进行了测试) - 我并不因为依赖与文档所说的直接相反的东西而欣喜若狂(kernel.org/doc/man-pages/online/pages/man7/pthreads.7.html

以上是关于使用 pthreads 时的后台线程(很好,优先级)的主要内容,如果未能解决你的问题,请参考以下文章

在停止等待协议实现中使用 pthread 时的 SIGSEGV

使用 pthread 调度策略和优先级没有任何区别

pthread优先级和pthread策略有啥关系?

pthread_setschedparam(设置线程的优先级)

pthread_setschedparam(设置线程的优先级)

以非常低的优先级运行线程