5

私はC++とQtでCDリッパーアプリケーションを構築しています。複数のトラックを同時にエンコードできるように、アプリケーションを並列化したいと思います。そのため、トラックのエンコードが「タスク」になるようにアプリケーションを構成し、これらのタスクのいくつかを同時に実行するメカニズムに取り組んでいます。もちろん、スレッドを使用してこれを実現し、独自のタスクキューまたはワークマネージャーを作成することもできますが、IntelのThreading Building Blocks(TBB)の方がこの作業に適したツールになると思いました。ただし、いくつか質問があります。

  1. WAVファイルをFLAC、Ogg Vorbis、またはMp3ファイルにエンコードすることは、tbb :: taskとしてうまく機能するものですか?チュートリアルドキュメントには、「スレッドが頻繁にブロックされると、タスクスケジューラを使用するとパフォーマンスが低下する」と記載されています。エンコードタスクがミューテックスを頻繁にブロックすることはないと思いますが、エンコードするためにディスクからWAVデータを読み取る必要があるため、ディスクに比較的頻繁にアクセスする必要があります。このレベルのディスクアクティビティは、チュートリアルで説明されている意味で問題がありますか?
  2. TBBはQtでうまく機能しますか?Qtスレッドを使用する場合、スレッド間で透過的にQtのシグナル/スロットメカニズムを使用できます。Qtスレッドの代わりにtbb::tasksを使用していた場合も、同じことが言えますか?他に「落とし穴」はありますか?

あなたが提供できる洞察に感謝します。

4

2 に答える 2

3

なぜQt Concurrentを使用しないのですか?

于 2009-07-11T21:18:41.573 に答える
1

TBB は、他のスレッド メカニズムと透過的にさえうまく動作すると想定されているため、理論的には、同じプログラムで QT のスレッド クラスを使用することを妨げるものは何もないはずです。GUI のように、QT スレッドでより自然に動作するものがある場合は、それらを使用し、TBB のものを可能な限り、または必要に応じて分離しておいてください。

現在設計の概要を説明しているように、TBB を最大限に活用しているとは思えません。最も大きなレベルであるファイルで並列化します。ご想像のとおり、CD はかなり遅いデバイスであるため、実際に保存するよりも、複数のファイルからデータをやり取りするのに多くの時間を費やしている可能性があります。

TBB を使用する場合、変換プロセスに存在するデータやタスクの並列処理を活用することで、実際に大きな成果を上げることができます。たとえば、ストリームからバイトのブロックを取り出して、ストリームの前後の部分とは関係なく、任意の変換を適用できますか? 並列化できる変換への複数のステップはありますか?

于 2009-07-11T21:38:31.283 に答える