Threading Building Blocks (TBB) для риппера компакт-дисков на основе Qt?

Я создаю приложение CD Ripper в C++ и Qt. Я хотел бы распараллелить приложение так, чтобы несколько дорожек могли быть закодированы одновременно. Поэтому я структурировал приложение таким образом, чтобы кодирование дорожки было "Задачей", и я работаю над механизмом для одновременного запуска некоторого числа этих Задач. Конечно, я мог бы выполнить это с помощью потоков и написать собственную очередь задач или менеджер работ, но я подумал, что Intel Threading Building Blocks (TBB) может быть лучшим инструментом для этой работы. У меня есть пара вопросов, однако.

  1. Является ли кодирование файла WAV в файл FLAC, Ogg Vorbis или Mp3 чем-то, что будет хорошо работать как tbb::task? В учебном документе говорится, что "если потоки часто блокируются, это приводит к снижению производительности при использовании планировщика задач". Я не думаю, что мои задачи кодирования будут часто блокировать мьютексы, но мне потребуется относительно часто обращаться к диску, так как они должны читать данные WAV с диска для кодирования. Является ли этот уровень активности диска проблематичным в смысле, описанном в руководстве?
  2. TBB хорошо работает с Qt? При использовании потоков Qt вы можете прозрачно использовать механизм сигналов / слотов Qt в потоках. Было бы то же самое, если бы я использовал tbb::tasks вместо потоков Qt? Будут ли какие-то другие "готы"?

Спасибо за любые идеи, которые вы можете предоставить.

2 ответа

Решение

Предполагается, что TBB работает хорошо, даже прозрачно, с другими механизмами потоков, поэтому теоретически ничто не должно мешать вам использовать классы потоков QT в той же программе. Если есть что-то, что более естественно работает с потоками QT, например, с графическим интерфейсом, используйте их и сохраняйте разделение TBB как можно лучше или лучше.

Я не вижу, чтобы вы наилучшим образом использовали TBB, поскольку в настоящее время вы описали свой дизайн. Вы распараллеливаете на самом грубом уровне файл. Как вы подозреваете, поскольку компакт-диск является довольно медленным устройством, вы можете тратить больше времени на поиск данных из нескольких файлов, чем на самом деле, и обратно.

Реальный удар по доллару с TBB должен включать использование любых данных и / или параллелизма задач, существующих в процессе преобразования. Можете ли вы, например, извлечь какой-либо блок байтов из потока и применить любое преобразование к нему независимо от какой-либо части потока до или после? Есть ли несколько этапов преобразования, которые можно распараллелить?

Почему бы не использовать Qt Concurrent?

Другие вопросы по тегам