2009-07-11 4 views
5

Sto costruendo un'applicazione CD ripper in C++ e Qt. Vorrei parallelizzare l'applicazione in modo tale che più tracce possano essere codificate contemporaneamente. Pertanto, ho strutturato l'applicazione in modo tale che la codifica di una traccia sia un "compito" e sto lavorando a un meccanismo per eseguire contemporaneamente un certo numero di queste attività. Naturalmente, potrei realizzare questo usando thread e scrivere la mia coda di attività o il mio manager di lavoro, ma pensavo che i Threading Building Blocks (TBB) di Intel potessero essere uno strumento migliore per il lavoro. Ho un paio di domande, comunque.Threading Building Blocks (TBB) per lo scarificatore di CD basato su Qt?

  1. Codifica un file WAV in un file FLAC, Ogg Vorbis o Mp3 qualcosa che funzionerebbe bene come un task :: task? Il documento tutorial afferma che "se i thread si bloccano frequentemente, si verifica una perdita di prestazioni quando si utilizza l'utilità di pianificazione". Non penso che i miei task di codifica possano bloccare frequentemente i mutex, ma è necessario accedere al disco relativamente frequentemente, poiché devono leggere i dati WAV dal disco per poterli codificare. Questo livello di attività del disco è problematico nel senso descritto dal tutorial?
  2. La TBB funziona bene con Qt? Quando si utilizzano i thread Qt, è possibile utilizzare il meccanismo di segnali/slot di Qt in modo trasparente attraverso i thread. Lo stesso sarebbe vero se usassi tbb :: tasks invece dei thread Qt? Ci sarebbero altri "trucchi"?

Grazie per eventuali approfondimenti che è possibile fornire.

risposta

1

TBB suppone che funzioni bene, anche in modo trasparente, con altri meccanismi di threading, quindi teoricamente non dovrebbe esserci nulla che impedisca l'utilizzo delle classi thread di QT nello stesso programma. Se c'è qualcosa che funziona in modo più naturale con i thread QT, come la GUI, usali e mantieni le cose TBB segregate come meglio puoi o vuoi.

Non vedo che stai sfruttando al meglio il TBB come hai delineato il tuo progetto. Si parallelizza al livello più grossolano, il file. Come sospetti, dal momento che il CD è un dispositivo piuttosto lento, puoi dedicare più tempo a cercare avanti e indietro i dati di più file rispetto a quelli effettivamente salvati.

Il vero colpo di fulmine con TBB dovrebbe implicare l'utilizzo di qualsiasi parallelismo di dati e/o attività nel processo di trasformazione. Puoi, ad esempio, estrarre qualsiasi blocco di byte dallo stream e applicare qualsiasi trasformazione ad esso indipendentemente da qualsiasi parte del flusso prima o dopo? Ci sono più passaggi per la trasformazione che possono essere parallelizzati?