5

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

当后台处理正在运行时,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 文档(因此以后可能会在系统范围内“修复”)

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

马库斯。

编辑:将 ::setpriority 添加到选项列表(感谢 ZalewaPL)

4

1 回答 1

3

将后台线程的 nice 值设置为更高的值可能会有所帮助。
请参阅: nice-Level for pthreads?

于 2012-12-07T12:25:40.473 回答