Шрифт:
К счастью, использование таймеров не требует глубокого понимания назначения полей этой структуры. На самом деле, крайне не рекомендуется использовать поля этой структуры не по назначению, чтобы сохранить совместимость с возможными будущими изменениями кода. Ядро предоставляет семейство интерфейсов для работы с таймерами, чтобы упростить эту работу. Все необходимые определения находятся в файле
Первый шаг в создании таймера — это его объявление в следующем виде.
Далее должны быть инициализированы поля структуры, которые предназначены для внутреннего использования. Это делается с помощью вспомогательной функции перед вызовом любых функций, которые работают с таймером.
Далее необходимо заполнить все остальные поля структуры, например, следующим образом.
Значение поля
Параметр
Последняя операция — это активизация таймера.
И таймер запускается! Следует обратить внимание на важность значения поля
Иногда может потребоваться изменить момент времени срабатывания таймера, который уже активизирован. В ядре реализована функция
Функция
Для того чтобы деактивизировать таймер до момента его срабатывания, необходимо использовать функцию
Эта функция работает как с активными, так и неактивными таймерами. Если таймер уже неактивен, то функция возвращает значение 0, в другом случае возвращается значение 1. Следует обратить внимание, что нет необходимости вызывать эту функцию для таймеров, интервал ожидания которых истек, так как они автоматически деактивизируются.
При удалении таймеров потенциально может возникнуть состояние конкуренции. Когда функция
В отличие от функции
Состояния конкуренции, связанные с таймерами
Так как таймеры выполняются асинхронно по отношению к выполняемому в данный момент коду, то потенциально могут возникнуть несколько типов состояний конкуренции за ресурсы. Во-первых, никогда нельзя использовать следующий код, как замену функции