Помощь, необходимая для реализации механизма мониторинга потока - PullRequest
2 голосов
/ 04 мая 2011

Я работаю в многопоточной среде промежуточного программного обеспечения.Фреймворк - это в основном фреймворк для захвата и передачи.Так что это включает в себя ряд потоков.

Чтобы дать вам общее представление об архитектуре потоков: есть отдельные потоки для демультиплексора , receiveVideo , DecodeVideo , DisplayVideo и т. Д. Каждый поток выполняет свои функции, например:
демультиплексор извлекает аудио, видео пакеты
receivevideo получает заголовок + полезную нагрузку видео пакета и удаляет полезную нагрузку
DecodeVideo получает полезную нагрузку и декодирует пакет полезной нагрузки
DisplayVideo принимает декодированные пакеты и отображает декодированные пакеты на дисплее

Таким образом, каждый поток передает извлеченные данные вследующая тема.Потоки разделяют между собой буферы данных, и буферы синхронизируются с помощью мьютексов и семафоров.Точно так же существуют другие потоки для обработки ananlogvideo и analogaudio и т. Д.

Все потоки создаются во время инициализации , но они остаются заблокированнымисемафор и в зависимости от входных (аналоговых / цифровых) селективных семафоров сигнализируются так, что определенные потоки разблокируются и переходят к выполнению своей работы.На различных этапах каждый поток вызывает некоторый более низкий уровень (вызовы драйверов) для получения данных или записи данных и т. Д. Эти вызовы блокируются, и ошибки, возникающие в результате этих вызовов (драйвер возвращает поврежденные данные, остановка драйвера), должны обрабатываться, но в настоящее время не обрабатываются.

Я хотел реализовать механизм мониторинга потоков , где поток будет отслеживать эти рабочие потоки и в случае возникновения ошибки предпримет некоторые предупреждающие действия.Как я понимаю, некоторые такие механизмы обычно используются как сторожевые таймеры в приложениях с пользовательским интерфейсом или MMI.Я пытаюсь найти что-то подобное.

Я использую pthreads и No Boost или STL (это устаревший код, в значительной степени процедурный C ++)

Любые идеи о конкретных шаблонах фреймворка или дизайна или проектах с открытым исходным кодом, которые делают что-то подобное и могутпомочь с идеями для реализации моего требования?

Ответы [ 2 ]

2 голосов
/ 24 июня 2011

Можете ли вы пропинговать потоки - периодически отправлять каждому сообщение в своей обычной очереди ввода, чередуясь со всеми другими обычными вещами, прося его вернуть свой статус?Когда каждый поток обработчика получает сообщение, он загружает сообщение с информацией о состоянии - сколько сообщений было обработано с момента последнего пинга, длина его очереди ввода / вывода, последний раз, когда его драйвер возвращал OK, такого рода статистика - и ставит его в очередьвернуться к вашему механизму контроля потоков.Ваш TMM должен был бы тайм-аут ответов в случае, если какой-либо поток / с застрял / застрял.

Вы можете, возможно, просто отправить одно сообщение по всей цепочке, каждый поток добавляет свой собственный статус в различных полях.Это будет означать только один тайм-аут, после которого ваш TMM должен будет изучить сообщение, чтобы увидеть, как далеко он продвинулся вниз по цепочке.

Есть и другие вещи - мне нравится сохранять экранный дамп наТаймер 1с, длины очередей и глубины буферных пулов.Если что-то заполняется, я обычно могу примерно сказать, где оно находится (например, пул опустошается, а какая-то очередь растет - потребитель очереди потрачен впустую).

Rgds, Martin

1 голос
/ 04 мая 2011

Как насчет использования системы сигнализации для пробуждения потока мониторинга, когда что-то пошло не так в одном из ваших рабочих потоков.Вы можете эмулировать сигнализацию с помощью ResetEvent некоторого типа.

Когда в рабочем потоке возникает исключение, у вас есть некоторая структура данных, которую вы заполняете данными об исключении, а затем можете передать их своемумониторинг потока.Вы активируете поток мониторинга, используя событие.

Тогда поток мониторинга может делать то, что вам нужно.

Я предполагаю, что вы не хотите иметь свой поток мониторингаактивен, если что-то пошло не так, верно?

...