5

重いバックグラウンド処理を行うためにpthreadを使用しているGUIアプリケーションがあります。

バックグラウンド処理の実行中、GUIは非常に応答しなくなります。これは、バックグラウンドスレッドによってCPU時間が不足しているためだと思います。

Windowsでは、バックグラウンドスレッドで:: SetThreadPriority(hThread、THREAD_PRIORITY_BELOW_NORMAL)を実行でき、すべて問題ありません。

ただし、Linuxではpthreadを使用しているため、適切な代替手段を見つけることができません。

私はすでに検討しました。

  • :: 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

バックグラウンドスレッドのナイス値をより高い値に設定すると役立つ場合があります。
これを参照してください: pthreads の Nice-Level?

于 2012-12-07T12:25:40.473 に答える