Реализация интервального таймера с минимальными издержками на C ++ в Linux

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

void timer_handler (int signum){
printf("In timer handler!\n");
}

int main (){

struct sigaction s_action;
struct itimerval timer;

/* Set Up a Timer */
/* Install timer_handler as the signal handler for SIGVTALRM. */
memset (&s_action, 0, sizeof (s_action));
s_action.sa_handler = &timer_handler;
sigaction (SIGVTALRM, &s_action, NULL);

/* Timer configuration for 100ms */
timer.it_value.tv_sec = 0;
timer.it_value.tv_usec = 100000;
timer.it_interval.tv_sec = 0;
timer.it_interval.tv_usec = 100000;

/* Set up the timer */
setitimer (ITIMER_VIRTUAL, &timer, NULL);

while(1);
}

Этот подход, однако, не кажется оптимальным способом (с точки зрения производительности) из-за бесконечного цикла. Это значительно увеличивает загрузку процессора. Как только он начинает работать в фоновом режиме, производительность других моих программ снижается примерно на 15%.

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

0

Решение

Читать Время (7), Сигнал (7), timerfd_create (2), Опрос (2), nanosleep (2) а также Расширенное программирование в Linux.

Ваш обработчик сигнала неверен (он не должен вызывать printf; это могло бы write).

Вы могли бы иметь

while(1) poll(NULL, 0, 1);

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

Я, конечно, предполагаю, что вы достаточно уверены, что каждая периодическая задача длится намного меньше, чем период. (например, каждая задача требует не более 50 миллисекунд, но имеет период 100 миллисекунд).

0

Другие решения


По вопросам рекламы [email protected]