5

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

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

感谢您提供的任何见解。

4

2 回答 2

3

为什么不使用Qt Concurrent

于 2009-07-11T21:18:41.573 回答
1

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

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

使用 TBB 真正物有所值应该涉及利用转换过程中存在的任何数据和/或任务并行性。例如,您能否将任何字节块从流中拉出并独立于流之前或之后的任何部分对其应用任何转换?转换是否有多个可以并行化的步骤?

于 2009-07-11T21:38:31.283 回答