Каков официальный способ вызова функции (C / C ++) в ab. каждые 1/100 сек в Linux? - PullRequest
5 голосов
/ 13 сентября 2010

У меня есть асинхронная система потока данных, написанная на C ++.В архитектуре потока данных приложение представляет собой набор экземпляров компонентов, которые инициализируются при запуске, а затем связываются друг с другом с помощью предварительно определенных сообщений.Существует тип компонента, называемый Pulsar, который предоставляет «сообщение тактового сигнала» другим компонентам, которые подключаются к нему (например, задержка).Он запускает сообщение (вызывает API диспетчера потоков данных) каждые X мс, где X - значение параметра «частоты», которое задается в мс.

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

Есть несколько методов, которые я нашел:

  • Используйте SIGALRM .Я думаю, что сигнализация не подходит для этой цели.Хотя разрешение составляет 1 сек, это слишком редко.
  • Использовать прерывание HW .Мне не нужна эта точность.Кроме того, я знаю об использовании решения, связанного с HW (сервер скомпилирован для нескольких платформ, например, ARM).
  • Измерение прошедшего времени и usleep () до следующего вызова. Я неуверен, что это лучший способ измерить время для системных вызовов, связанных с временем, по 5 потокам, каждые 10 раз в секунду - но, возможно, я ошибаюсь.
  • Использовать функции ядра RealTime .Я ничего не знаю об этом.Кроме того, мне не нужен кристально точный вызов, это не атомный реактор, и я не могу установить ядро ​​RT на некоторых платформах (также доступно ядро ​​2.6.x).

Может быть,лучший ответ - короткая закомментированная часть исходного кода аудио / видео плеера (который я не могу найти / понять самостоятельно).

ОБНОВЛЕНИЕ (запрошено @MSalters): соавторпроект DF использует Mac OSX, поэтому мы должны найти решение, которое работает на большинстве Posix-совместимых операционных систем.системы, не только в Linux.Возможно, в будущем появится целевое устройство, которое использует BSD, или какой-нибудь ограниченный Linux.

Ответы [ 4 ]

3 голосов
/ 13 сентября 2010

Если вам не нужны жесткие гарантии в реальном времени, usleep должен выполнить эту работу. Если вам нужны жесткие гарантии в реальном времени, тогда потребуется функция на основе прерываний или ядро ​​в реальном времени.

2 голосов
/ 13 сентября 2010

Альтернативой ранее упомянутым подходам является использование поддержки Timer FD в Linux Kernels 2.6.25+ (практически любой дистрибутив, близкий к "текущему"). Таймер FD обеспечивает немного большую гибкость, чем предыдущие подходы.

2 голосов
/ 13 сентября 2010

Честно говоря, я думаю, что наличие «пульсара» в том, что претендует на звание асинхронной системы потока данных, является недостатком дизайна. Либо он асинхронный, либо имеет синхронизирующее тактовое событие.

Если у вас есть компонент, для которого требуется задержка, попросите его запросить его через boost :: asio :: deadline_timer.async_wait или любое из решений более низкого уровня (select () / epoll () / timer_create () / и т. д.) В любом случае, наиболее эффективным решением C ++ , вероятно, являются таймеры boost.asio, поскольку они будут использовать все, что наиболее эффективно в вашей версии ядра Linux.

1 голос
/ 13 сентября 2010

Пренебрежение вопросом дизайна (который я считаю интересным вопросом, но заслуживает отдельной темы) ...

Я бы начал с разработки идеи «прерывания» и использования сигналов или некоторой функции ядра для прерывания каждого использования X. Я бы откладывал выполнение функций сна, пока другие идеи не стали слишком болезненными.

...