Russian Qt Forum

Qt => Многопоточное программирование, процессы => Тема начата: svetocopy от Январь 24, 2013, 13:51



Название: архитектура producer & consumer threads
Отправлено: svetocopy от Январь 24, 2013, 13:51
Здравствуйте! Не могу найти оптимальное решение для моей проблемы, поэтому обращаюсь за советом как грамотно построить архитектуру приложения.
В общем ситуация такая: producer thread производит данные (читает данные с сетевухи. после того, как пакеты соберутся выходная информация представляет собой uchar массив размером 3000 байт), consumer thread эти данные обрабатывает. Требуется эти два потока как-то состыковать, чтобы producer не терял пакеты и consumer своевременно обрабатывал.
Я пытался складывать данные в циркулярный буфер на семафорах (см. пример Qt) и потом в потоке обработке считывать, но это решение грузит процессор , относительно конечно, но для моей задачи процент загрузки не приемлим.
Можно ли слать данные сигналом и как в таком случае быть уверенным, что все данные автоматически встанут в очередь и не потеряются?
Как грамотно решаются подобные задачи? Заранее спасибо!.

upd. время обработки данных является не постоянной величиной


Название: Re: архитектура producer & consumer threads
Отправлено: Igors от Январь 24, 2013, 15:00
С сигналами писать (значительно) легче но быстрее это быть никак не должно. Др стандартная техника - использование QWaitCodition. В принципе в Qt все синхронизации реализованы на одних и тех же базовых примитивах ОС, поэтому шансов обогнать circular buffer немного. Больше подробностей загрузки и др - тогда возможно будет больше советов.


Название: Re: архитектура producer & consumer threads
Отправлено: Old от Январь 24, 2013, 15:05
Я пытался складывать данные в циркулярный буфер на семафорах (см. пример Qt) и потом в потоке обработке считывать, но это решение грузит процессор , относительно конечно, но для моей задачи процент загрузки не приемлим.
Покажи, как ты делал и попробуем исправить.


Название: Re: архитектура producer & consumer threads
Отправлено: svetocopy от Январь 25, 2013, 13:13
Здравствуйте! Не могу найти оптимальное решение для моей проблемы, поэтому обращаюсь за советом как грамотно построить архитектуру приложения.
В общем ситуация такая: producer thread производит данные (читает данные с сетевухи. после того, как пакеты соберутся выходная информация представляет собой uchar массив размером 3000 байт), consumer thread эти данные обрабатывает. Требуется эти два потока как-то состыковать, чтобы producer не терял пакеты и consumer своевременно обрабатывал.
Я пытался складывать данные в циркулярный буфер на семафорах (см. пример Qt) и потом в потоке обработке считывать, но это решение грузит процессор , относительно конечно, но для моей задачи процент загрузки не приемлим.
Можно ли слать данные сигналом и как в таком случае быть уверенным, что все данные автоматически встанут в очередь и не потеряются?
Как грамотно решаются подобные задачи? Заранее спасибо!.

upd. время обработки данных является не постоянной величиной
Ребята, всем огромное спасибо! Я во всем разобрался.

Со мной случился синдром ночного программирования, сжатые сроки и объем проекта сделали свое дело. Оказалось вообще в стороннем модуле программы, который я отключил на время отладки, одна из функция висела в busy wait - захватывала и освобождала мьютекс, и когда настала пора собирать проект в кучу, то про нее я напрочь забыл. Она то и грузила процессор.

А так решение сделать круговой буфер на семафорах оказалось вполне приемлимым.