Threading Building Blocks (TBB) для риппера компакт-дисков на основе Qt? - PullRequest
5 голосов
/ 11 июля 2009

Я создаю приложение 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 ]

3 голосов
/ 12 июля 2009

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

1 голос
/ 12 июля 2009

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

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

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

...