0

私には、数百に及ぶ長期にわたる操作がいくつかあります。現時点では、それぞれが独自のスレッドにあります。スレッドを使用する際の私の主な目標は、これらの操作を高速化することではありません。この場合のより重要なことは、それらが同時に実行されているように見えることです。

私は協調マルチタスクとファイバーを知っています。ただし、操作でコードに触れる必要のあるものは避けようとしています。たとえば、などを使用してコードをペッパーするなどyieldToScheduler()です。また、これらのルーチンが一口サイズのタスクアイテムのキューを発行するようにコード化されるように定型化されることを規定したくありません...それらをブラックボックスとして扱いたいです。

今のところ、私はこれらの欠点を抱えて生きることができます:

  • スレッドの最大数はO(1000)になる傾向があります
  • スレッドあたりのコストはO(1MB)です

コンテキストスイッチによるキャッシュパフォーマンスの低下に対処するために、idealThreadCount()スレッドのみが通常の優先度になり、残りはすべてアイドルに設定されるように優先度を調整するタイマーのアイデアがありました。これにより、タイムスライスを広げることができます。つまり、コンテキストスイッチが少なくなり、私の目的には問題ありません。

質問1:それは良い考えですか?確かな欠点の1つは、Linuxでは機能しないことです(ドキュメントによると、そこにはありませんQThread::setPriority())。

質問2:他のアイデアやアプローチはありますか?QtConcurrentはこのシナリオについて考えていますか?

(いくつかの関連する読み物:how-many-threads-does-it-take-to-make-them-a-bad-choicemany-threads-or-as-few-threads-as-possiblemaximum-number-of -threads-per-process-in-linux

4

2 に答える 2

0
  1. 私見、これは非常に悪い考えです。もし私があなたなら、これを行う別の方法を見つけるために本当に、本当に一生懸命努力するでしょう。あなたは2つの本当に悪い考えを組み合わせています:スレッドのトラックの負荷を作成することと、スレッドの優先順位をいじることです。

  2. これらの操作は、同時に実行されているように見えるだけでよいとおっしゃいました。では、文字通り同時に実行するのではなく、同時に実行されているように見せるための方法を見つけてみませんか?

于 2009-12-29T05:04:24.270 に答える
0

半年経ちましたので、これを締めくくります。

まず、スレッドは複数の目的を果たします。1つは高速化です...そして多くの人々がマルチコアマシンの時代にそれに焦点を合わせています。ただし、もう1つは同時実行性です。これは、全体としてシステムの速度が低下した場合でも望ましい場合があります。ただし、コードを複雑にする可能性はありますが、スレッドよりも軽量なメカニズムを使用して並行性を実現できます。

したがって、これは、プログラマーの利便性とユーザーエクスペリエンスのトレードオフを、ターゲット環境に合わせて調整する必要がある状況の1つにすぎません。これは、Chromeを使用したタブごとのプロセスに対するGoogleのアプローチが、Mosaicの時代には不適切であった方法です(他のすべてが同等である場合でも、プロセスの分離が望ましい場合でも)。OS、メモリ、およびCPUが優れたブラウジング体験を提供できなかった場合、現在はそのようにはなりません。

同様に、並行させたい独立した操作があるときに多数のスレッドを作成すると、独自のスケジューラーとyield()操作に固執する手間が省けます。これはコードを表現するための最もクリーンな方法かもしれませんが、ターゲット環境を詰まらせる場合は、別のことを行う必要があります。

ですから、将来、ハードウェアが現在よりも優れている場合は、スレッドの数を気にする必要はないだろうという考えに落ち着くと思います。しかし、今のところ、私はケースバイケースでそれを取ります。つまり、100個の同時タスククラスA、10個の同時タスククラスB、および3個の同時タスククラスCがある場合、Aをファイバーベースのソリューションに切り替えて、いくつかのスレッドのプールを与えることはおそらく価値があります。余分な複雑さ。

于 2010-06-07T00:30:11.847 に答える