У меня есть асинхронная система потока данных, написанная на C++. В архитектуре потока данных приложение представляет собой набор экземпляров компонентов, которые инициализируются при запуске, затем они обмениваются данными с заранее определенными сообщениями. Существует компонент типа Pulsar, который предоставляет «сигнал синхросигнала» другим компонентам, которые подключаются к одному из них (например, Delay). Он запускает сообщение (вызывает API диспетчера потока данных) каждые X ms, где X - значение параметра «частота», которое задается в мс.Каков официальный способ вызова функции (C/C++) в ab. каждые 1/100 сек в Linux?
Короткий, задача состоит в том, чтобы вызвать функцию (метод) в каждом X ms. Вопрос в том, что это лучший/официальный способ сделать это? Есть ли какой-нибудь шаблон для этого?
Есть некоторые методы, которые я нашел:
- Использование SIGALRM. Я думаю, сигнализация не подходит для этой цели. При этом разрешение составляет 1 секунду, это слишком редко.
- Использование прерывания HW. Мне не нужна эта точность. Кроме того, я знаю, используя HW-решение (сервер скомпилирован для нескольких платформ, например ARM).
- Измерьте прошедшее время и спящий() до следующего вызова. Я не уверен, что это лучший способ измерить время для вызова системных вызовов по времени на 5 потоков, каждый раз 10 раз в секунду - но, возможно, я ошибаюсь.
- Использование функций ядра RealTime. Я ничего не знаю об этом. Кроме того, мне не нужен хрустальный точный вызов, это не атомный реактор, и я не могу установить RT-ядро на некоторых платформах (также доступно ядро 2.6.x).
Возможно, лучший ответ - это короткая часть исходного кода аудио/видео плеера (который я не могу найти/понять самостоятельно).
ОБНОВЛЕНИЕ (по просьбе @MSalters): Соавтор проекта DF использует Mac OSX, поэтому мы должны найти решение, которое работает на большинстве Posix-compilant op. систем, а не только на Linux. Возможно, в будущем появится целевое устройство, использующее BSD или ограниченный Linux.
Сигнал подходит, несмотря на ваши оговорки. Проверьте «man setitimer», дайте ему понять и сообщите нам, если у вас есть актуальные проблемы. Если вы уже блокируете что-то вроде select(), вместо этого вы можете использовать значение тайм-аута. –
Является ли сигнализация хорошим выбором для многопоточного приложения? Когда поступает сигнал, он должен быть «отправлен» в соответствующую нить. – ern0
Сигнальные маски для потоковой передачи, поэтому вы можете блокировать 'SIGALRM' в каждом другом потоке. – caf