Нужно ли вызывать 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 3

1 ответ:

Да, вам нужно явно удалить таймер.

Взгляните на страницу man(2) для timer_create. В разделе notes (в частности, в третьем примечании) Вы увидите, что каждый вызов timer_create использует ресурсы в ядре, и общее число таймеров для всех процессов, которые могут быть выделены ядром сразу, ограничено.

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

Это похоже на утечку памяти-очистите ресурсы, которые вы используете, или вы в конечном итоге закончите.

Ответьте на ваш последующий вопрос
В комментариях ниже вы спросили, Можно ли вызвать timer_delete из своей функции обратного вызова. Я не был уверен, как ответить, поэтому я сам открыл вопрос об этом. Ответ, похоже, будет возможно . Вы можете попробовать поэкспериментировать с ним и посмотреть, работает ли он, но я бы рекомендовал против оно. Я никогда не видел кода, который удаляет таймер из обратного вызова, и мысль об освобождении ресурсов таймера до завершения обработки события заставляет меня нервничать.

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