重いバックグラウンド処理を行うために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に感謝)