2009-07-11 4 views
5

C++ 및 Qt에서 CD 리퍼 응용 프로그램을 구축하고 있습니다. 여러 트랙을 동시에 인코딩 할 수 있도록 응용 프로그램을 병렬 처리하고 싶습니다. 따라서 트랙을 인코딩하는 작업이 "작업"인 방식으로 응용 프로그램을 구조화했으며이 작업의 일부를 동시에 실행하는 메커니즘을 연구하고 있습니다. 물론 스레드를 사용하여이 작업을 수행하고 내 작업 대기열 또는 작업 관리자를 작성할 수는 있지만 인텔의 스레딩 구성 요소 (TBB)가 작업을위한 더 나은 도구라고 생각했습니다. 그러나 몇 가지 질문이 있습니다.Qt 기반 CD 리퍼 용 스레딩 구성 요소 (TBB)?

  1. WAV 파일을 tbb :: task로 잘 작동하는 FLAC, Ogg Vorbis 또는 Mp3 파일로 인코딩하고 있습니까? 이 튜토리얼 문서에는 "스레드가 자주 차단되면 작업 스케줄러를 사용할 때 성능이 저하된다"고되어 있습니다. 인코딩 작업이 뮤텍스를 자주 차단할 것이라고 생각하지 않지만 엔코딩하기 위해 디스크에서 WAV 데이터를 읽어야하므로 비교적 자주 디스크에 액세스해야합니다. 이 레벨의 디스크 활동은이 자습서에서 설명한대로 문제가 있습니까?
  2. TBB가 Qt와 잘 작동합니까? Qt 쓰레드를 사용할 때 Qt의 시그널/슬롯 메커니즘을 쓰레드간에 투명하게 사용할 수 있습니다. Qt 쓰레드 대신에 tbb :: tasks를 사용한다면 마찬가지일까요? 다른 "잡았다"가 있을까요?

당신이 제공 할 수있는 통찰력을 주셔서 감사합니다.

답변

1

TBB는 다른 스레딩 메커니즘으로도 투명하게 작동한다고 가정하기 때문에 이론적으로 QT의 스레드 클래스를 동일한 프로그램에서 사용하는 것을 방해하지 않아야합니다. GUI와 같이 QT 스레드로 더 자연스럽게 작동하는 것이 있으면이를 사용하고 가능한 한 최선의 방법으로 분리 된 TBB 항목을 유지하십시오.

현재 디자인의 윤곽을 그리는 것처럼 TBB를 최대한 활용하고있는 것은 아닙니다. 가장 큰 단계 인 파일에서 병렬 처리합니다. CD는 꽤 느린 장치이기 때문에 실제로 저장하는 것보다 여러 파일의 데이터를 앞뒤로 검색하는 데 더 많은 시간을 할애 할 수 있습니다.

TBB가있는 실제 이점은 변환 프로세스에있는 데이터 및/또는 작업 병렬성을 악용해야합니다. 예를 들어, 스트림에서 임의의 바이트 블록을 가져 와서 스트림 전후의 어떤 부분과도 독립적으로 변환을 적용 할 수 있습니까? 병렬화 할 수있는 변환 단계가 여러 개 있습니까?