Нужно ли вызывать timer delete, чтобы удалить таймер каждый раз?
Я использовал timer_create()
в следующем коде. Он запустит обработчик только один раз через 10 секунд.
struct itimerspec itimer = { { 0, 0 }, { 10, 0 } };
struct sigevent si;
memset (&si, 0, sizeof (struct sigevent));
si.sigev_notify = SIGEV_THREAD;
si.sigev_notify_attributes = NULL;
si.sigev_notify_function = t;
if (timer_create (CLOCK_REALTIME, &si, &timer) < 0)
{
fprintf (stderr, "[%d]: %sn", __LINE__, strerror (errno));
exit (errno);
}
if (timer_settime (timer, 0, &itimer, NULL) < 0)
{
fprintf (stderr, "[%d]: %sn", __LINE__, strerror (errno));
exit (errno);
}
Мой вопрос в том, что через 10 секунд мой обработчик сработал - теперь мне нужно удалить таймер с помощью timer_delete()
Перед выходом из процесса? Или, поскольку он срабатывает только один раз, нет необходимости удалять его явно?
1 ответ:
Да, вам нужно явно удалить таймер.
Взгляните на страницу man(2) для timer_create. В разделе notes (в частности, в третьем примечании) Вы увидите, что каждый вызов
timer_create
использует ресурсы в ядре, и общее число таймеров для всех процессов, которые могут быть выделены ядром сразу, ограничено.Если вы не удалите ваши таймеры, вы в конечном итоге закончите их и любые приложения, которые должны выделение таймеров может завершиться неудачей.
Это похоже на утечку памяти-очистите ресурсы, которые вы используете, или вы в конечном итоге закончите.
Ответьте на ваш последующий вопрос
В комментариях ниже вы спросили, Можно ли вызватьtimer_delete
из своей функции обратного вызова. Я не был уверен, как ответить, поэтому я сам открыл вопрос об этом. Ответ, похоже, будет возможно . Вы можете попробовать поэкспериментировать с ним и посмотреть, работает ли он, но я бы рекомендовал против оно. Я никогда не видел кода, который удаляет таймер из обратного вызова, и мысль об освобождении ресурсов таймера до завершения обработки события заставляет меня нервничать.Кроме того, тестирование может иногда давать хорошие результаты, но иметь случайные сбои, так как вы имеете дело с асинхронными событиями. Кроме того, ваша основная программа должна работать до тех пор, пока обратный вызов не завершится (они выполняются в одном и том же процессе, только в разных потоках), поэтому вы можете также удалить таймер в главном потоке прямо перед выходом. Я думаю, что это более безопасное решение, и его будет легче отладить.