2009-07-11 26 views
5

Tôi đang xây dựng một ứng dụng ripper CD trong C++ và Qt. Tôi muốn song song ứng dụng sao cho nhiều bản nhạc có thể được mã hóa đồng thời. Do đó, tôi đã cấu trúc ứng dụng theo cách mã hóa một bản nhạc là "Tác vụ" và tôi đang làm việc trên một cơ chế để chạy đồng thời một số nhiệm vụ này. Tôi có thể, tất nhiên, thực hiện điều này bằng cách sử dụng các chủ đề và viết hàng đợi nhiệm vụ của riêng tôi hoặc người quản lý công việc, nhưng tôi nghĩ rằng khối xây dựng luồng của Intel (TBB) có thể là một công cụ tốt hơn cho công việc. Tôi có một vài câu hỏi, tuy nhiên.Luồng xây dựng luồng (TBB) cho trình rip CD dựa trên Qt?

  1. Đang mã hóa tệp WAV thành tệp FLAC, Ogg Vorbis hoặc Mp3 có thể hoạt động tốt như một tác vụ tbb ::? Tài liệu hướng dẫn nói rằng "nếu chuỗi chặn thường xuyên, sẽ mất hiệu suất khi sử dụng công cụ lên lịch tác vụ". Tôi không nghĩ rằng nhiệm vụ mã hóa của tôi sẽ chặn cho mutexes thường xuyên, nhưng sẽ cần phải truy cập đĩa tương đối thường xuyên, vì họ phải đọc dữ liệu WAV từ đĩa để mã hóa. Mức độ hoạt động của đĩa có vấn đề theo nghĩa được mô tả trong hướng dẫn này không?
  2. TBB có hoạt động tốt với Qt không? Khi sử dụng các luồng Qt, bạn có thể sử dụng cơ chế tín hiệu/khe của Qt một cách minh bạch trên các luồng. Sẽ là đúng nếu tôi đã sử dụng tbb :: nhiệm vụ thay vì chủ đề Qt? Sẽ có bất kỳ "gotchas" khác?

Cảm ơn bạn đã cung cấp thông tin chi tiết.

Trả lời

1

TBB được cho là hoạt động tốt, thậm chí minh bạch, với các cơ chế luồng khác, vì vậy về mặt lý thuyết không có gì ngăn cản bạn sử dụng các lớp chuỗi của QT trong cùng một chương trình. Nếu có điều gì đó hoạt động tự nhiên hơn với các luồng QT, như GUI, hãy sử dụng chúng và giữ cho các công cụ TBB tách biệt tốt nhất mà bạn có thể hoặc muốn.

Tôi không thấy rằng bạn đang tận dụng tối đa TBB như bạn đã phác thảo thiết kế của mình. Bạn song song ở mức cao nhất, tệp. Như bạn nghi ngờ, vì CD là một thiết bị khá chậm, bạn có thể dành nhiều thời gian tìm kiếm qua lại dữ liệu từ nhiều tệp hơn là bạn thực sự lưu.

Bang thực sự cho buck với TBB nên liên quan đến việc khai thác bất kỳ dữ liệu và/hoặc nhiệm vụ song song nào có trong quá trình chuyển đổi. Ví dụ, bạn có thể kéo bất kỳ khối byte nào ra khỏi luồng và áp dụng bất kỳ biến đổi nào cho nó một cách độc lập với bất kỳ phần nào của luồng trước hoặc sau? Có nhiều bước để biến đổi có thể được song song không?

Các vấn đề liên quan