web-dev-qa-db-ja.com

マルチスレッドを使いすぎているかどうかはどうすればわかりますか?

現在、マルチスレッドを使いすぎているように感じています。

A、B、Cの3種類のデータがあります。

Aは複数のBsに変換でき、各Bは複数のCsに変換できます。

Csの扱いのみに関心があります。

いくつかの変換関数を使って、これをかなり簡単に書くことができました。しかし、私はそれをスレッド、3つのキュー(queue_aqueue_bおよびqueue_c)で実装しているところを見つけました。異なる変換を行う2つのスレッドと1つのワーカーがあります。

  • ConverterAqueue_aから読み取り、queue_bに書き込みます
  • ConverterBqueue_bから読み取り、queue_cに書き込みます
  • Workerqueue_cの各要素を処理します

変換はかなり平凡であり、このモデルが複雑すぎるかどうかはわかりません。しかし、それは私には非常に頑丈に思えます。各「コンバーター」は、データがキューに到着する前でも動作を開始できます。コードでいつでも、新しいAsまたはBsを「送信」すると、変換パイプラインがトリガーされますこれにより、ワーカースレッドによってジョブがトリガーされます。

結果のコードも簡単に見えます。しかし、私が単純なもののためにスレッドを乱用しているかどうかはまだわかりません。

15
exhuma

ほとんどの場合、逐次的に考え、その後、そのロジックを変更して、スレッドを使用して機能するようにするのが簡単です。そして、表現が進むにつれて、「それが壊れていないなら、それを修正しないでください。」ほとんどのプログラマーは、スレッドを使用する必要がないという理由だけでスレッドを使用しません。

あなたがそれらをより快適に使用できると感じるなら、あなたにもっと力を。ただし、スレッドがボトルネックを解消することによって速度を向上させない場合、スレッドがプログラムを遅くしていることはほぼ確実です。

また、プロセスに1つのCPUのみを使用するシステムは、リソースを節約するために1つのスレッドで複数のスレッドをシミュレートすることを考慮してください(これは最近のコンピューターではあまり発生しませんが、スマートフォンアプリケーションはこの悪用の対象となります)。この場合、スレッドを使用してボトルネックを解消している場合でも、スレッドをまったく使用しなかった場合よりも実際にはslowerになります。

そして、おそらくスレッドを使用するために注意を払う最も微妙な理由ですが、確かにそれほど重要ではありませんが、スレッドは予期しないことをする傾向があります。はい、予防策を講じている場合は、大丈夫です。はい、スレッドがスレッド間で共有される変数に書き込まない場合は、問題ありません。とはいえ、スレッド関連のバグを見つけるのは非常に困難です。プログラマーはコードにバグを作成する可能性を完全に排除することはできないため、プログラマーはバグを完全に排除することに焦点を当てるのではなく、可能性のあるバグから保護するための対策を講じる必要があると考えています。スレッドのバグを見つけることもできます。言い換えれば、最善の努力にもかかわらず、コードでスレッドを使用すると、遅かれ早かれ、スレッドを使用しなければ他の方法では実現できない非常に深刻なバグが発生することを知っておいてください。

とにかくスレッドを使用する必要がありますか?まあ、特にスレッドが上手になれば、スレッドに関する健全な知識は確かに悪いことではありません。ただし、最近の動きは、node.jsなどのシングルスレッド言語に向かっています。シングルスレッドを使用する主な利点の1つは、拡張が容易であり、命令が順次実行されることが予想される場合は、特定の最適化を行うことができることです(最適化によって並列実行できる命令が実行できることを意味する場合でも)非同期で実行されます)。

そうは言っても、私はあなたにとって最も快適なことをします。私の経験では、あなたが理解できるプログラムを書くことは、それをより速く動作させることよりも優先されます。プログラムを書くのに役立つと思うときはスレッドを使用してください。パフォーマンスをあまり気にする必要がないので、スレッドをより速く動作させたいからではありません作成中プログラム(最適化は重要ですが、待つこともできます)。

17
Neil