基于Qt的CD开膛手的线程构建模块(TBB)?

时间:2009-07-11 12:02:09

标签: c++ multithreading qt concurrency tbb

我正在用C ++和Qt构建一个CD ripper应用程序。我想并行化应用程序,以便可以同时编码多个轨道。因此,我以这样的方式构建应用程序,即对轨道进行编码是一个“任务”,我正在研究一种机制来同时运行一些这些任务。当然,我可以使用线程完成此任务并编写自己的任务队列或工作管理器,但我认为英特尔的线程构建模块(TBB)可能是一个更好的工具。不过,我有几个问题。

  1. 是否将WAV文件编码为FLAC,Ogg Vorbis或Mp3文件,这些文件可以作为tbb :: task运行良好?教程文档指出“如果线程频繁阻塞,则在使用任务调度程序时会出现性能损失”。我不认为我的编码任务会经常阻塞互斥锁,但需要相对频繁地访问磁盘,因为它们必须从磁盘读取WAV数据才能进行编码。在本教程描述的意义上,这种级别的磁盘活动是否有问题?
  2. TBB是否与Qt配合良好?使用Qt线程时,可以跨线程透明地使用Qt的信号/插槽机制。如果我使用tbb :: tasks而不是Qt线程,是否也是如此?会不会有其他“陷阱”?
  3. 感谢您提供的任何见解。

2 个答案:

答案 0 :(得分:3)

为什么不使用Qt Concurrent

答案 1 :(得分:1)

TBB假设与其他线程机制一起工作得很好,甚至是透明的,所以理论上应该没有什么能阻止你在同一个程序中使用QT的线程类。如果有一些东西可以更自然地与QT线程一起使用,比如GUI,那就使用它们并保持TBB的内容尽可能地隔离。

我没有看到您正在充分利用TBB,因为您目前已经概述了您的设计。您在最粗糙的级别,文件并行化。正如您所怀疑的那样,由于CD是一个非常慢的设备,您可能会花费更多时间来回寻找来自多个文件的数据,而不是实际保存。

TBB的真正优势应该是利用转换过程中的任何数据和/或任务并行性。例如,你可以从流中拉出任何字节块,并在流之前或之后独立于流的任何部分应用任何变换吗?是否有可以并行化的转换的多个步骤?