Шаблон для реализации низкоприоритетных фоновых потоков? - PullRequest
0 голосов
/ 05 октября 2011

У меня есть (мягкая) система реального времени, которая запрашивает некоторые данные датчика, выполняет некоторую обработку и затем ждет следующего набора данных датчика.Данные датчика считываются в потоке получателя и помещаются в очередь, поэтому основной поток «спит» (посредством мьютекса) до тех пор, пока не поступят новые данные.

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

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

В соответствии с Установка приоритета потока в Linux с Boost есть сомнения, что установка приоритетов потока сделает эту работу.Мне интересно, как я могу измерить, какой эффект установки приоритетов потоков действительно имеет?(Платформа: Angstrom Linux, ARM PC)

Есть ли способ полностью "приостановить" и "продолжить" потоки?

Есть ли в C ++ шаблон, который может реализовать паузу / продолжитьмой собственный?(Возможно, я смогу разбить фоновую работу на маленькие куски, и я мог бы проверять после каждого куска работы, разрешено ли мне продолжать, но вопрос в том, насколько большими должны быть эти куски и т. Д.)

Спасибо затвои мысли!

Ответы [ 2 ]

4 голосов
/ 05 октября 2011

Ваша проблема с планировщиком ОС, а не C ++. У вас должен быть real планировщик реального времени, который будет блокировать потоки с более низким приоритетом во время работы потока с более высоким приоритетом.

Большинство «стандартных» планировщиков ПК не в режиме реального времени. Есть планировщик RT для Linux - используйте его. Начните с чтения о SCHED_RR и SCHED_FIFO и команды nice.

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

0 голосов
/ 05 октября 2011

Нет портативного способа установить приоритет в Boost :: Thread.Причина в том, что разные ОС будут иметь разные API для установки приоритета (например, Windows и Linux).

Лучший способ установить приоритет переносимым способом - написать оболочку для boost :: thread с единым API, который внутренне получает поток native_handle, а затем использует API, специфичный для ОС (например,Linux вы можете использовать sched_setscheduler ()).Вы можете увидеть пример здесь: https://sourceforge.net/projects/threadutility/ (код, созданный моим студентом, посмотрите на хранилище SVN)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...