私には、数百に及ぶ長期にわたる操作がいくつかあります。現時点では、それぞれが独自のスレッドにあります。スレッドを使用する際の私の主な目標は、これらの操作を高速化することではありません。この場合のより重要なことは、それらが同時に実行されているように見えることです。
私は協調マルチタスクとファイバーを知っています。ただし、操作でコードに触れる必要のあるものは避けようとしています。たとえば、などを使用してコードをペッパーするなどyieldToScheduler()
です。また、これらのルーチンが一口サイズのタスクアイテムのキューを発行するようにコード化されるように定型化されることを規定したくありません...それらをブラックボックスとして扱いたいです。
今のところ、私はこれらの欠点を抱えて生きることができます:
- スレッドの最大数はO(1000)になる傾向があります
- スレッドあたりのコストはO(1MB)です
コンテキストスイッチによるキャッシュパフォーマンスの低下に対処するために、idealThreadCount()スレッドのみが通常の優先度になり、残りはすべてアイドルに設定されるように優先度を調整するタイマーのアイデアがありました。これにより、タイムスライスを広げることができます。つまり、コンテキストスイッチが少なくなり、私の目的には問題ありません。
質問1:それは良い考えですか?確かな欠点の1つは、Linuxでは機能しないことです(ドキュメントによると、そこにはありませんQThread::setPriority()
)。
質問2:他のアイデアやアプローチはありますか?QtConcurrentはこのシナリオについて考えていますか?
(いくつかの関連する読み物:how-many-threads-does-it-take-to-make-them-a-bad-choice、many-threads-or-as-few-threads-as-possible、maximum-number-of -threads-per-process-in-linux)