Я пишу программу, в которой несколько производителей генерируют данные, которые должны обрабатываться несколькими потребителями. Поскольку потребление каждого фрагмента данных занимает около 100 мс, а целевая платформа имеет много процессоров, мне кажется естественным, что каждый производитель и каждый потребитель получают свой собственный поток. Мой вопрос: являются ли сигналы / слоты Qt хорошим способом передачи блоков данных от производителей к потребителям? Или вы предлагаете лучшее решение (Qt настоятельно рекомендуется).
На всякий случай это актуально, производители производят данные по несколько сотен тысяч каждый час или около того.
Я не думаю, что механизм сигнал / слот уместен здесь, потому что каждый сигнал распространяется на все подключенные слоты. Это означает, что если вы используете механизм сигнала / слота в качестве «рабочей очереди», вы не получите никакого распределения нагрузки по потребителям, а скорее, чтобы все потребители выполняли одинаковую (дублирующую) работу.
Лучшим механизмом было бы использование контейнера в качестве рабочей очереди (производители добавляют элементы в контейнер, потребители удаляют их) с QMutex
чтобы избежать проблем параллелизма и один (или два, если вы хотите наложить максимальный размер) QWaitCondition
блокировать потребителей, когда для них нет работы.
Я рекомендую вам избегать использования сигналов и слотов, так как они действуют как события, поэтому вы не можете контролировать выполнение после того, как сигнал испущен. Поэтому я предлагаю вам использовать блокировки или мьютексы (например, QMutex) для взаимного исключения. Просто защитите свои очереди, используя методы блокировки и разблокировки из класса QMutex. Я думаю, что это будет быстрее, чем использование сигналов и слотов, поскольку, если вы передадите объекты, они передадут копии объектов и, в случае, если вы передадите указатели, вы не будете защищать объекты.
Ура,