Название: архитектура 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 - захватывала и освобождала мьютекс, и когда настала пора собирать проект в кучу, то про нее я напрочь забыл. Она то и грузила процессор. А так решение сделать круговой буфер на семафорах оказалось вполне приемлимым. |