so_4: Принцип работы простейшего таймера

Класс so_4::timer_thread::simple::timer_thread_t является простейшим таймером. Он реализован с использованием самых тривиальных средств ОС.

Таймер реализован в виде нити и очереди заявок. Каждая заявка (so_4::timer_thread::simple::timer_demand_t) -- это экземпляр сообщения с информацией о времени, оставшегося до наступления сообщения. Нить засыпает на некоторый период времени, называемый тайм-аутом. После каждого тайм-аута просматривается очередь заявок и у каждой заявки уменьшается оставшееся время. Если оставшееся время обнулилось, то заявка обрабатывается.

Обработанные заявки из очереди вычеркиваются (если они не переодические). Вычеркивание заявки из очереди означает автоматическое уничтожение экземпляра сообщения. Для переодической заявки отсчет времени начинается сначала.

Очевидно, что чем меньше используемая величина тайм-аута, тем точнее отсчет времени. Однако, минимальная величина тайм-аута зависит от особенностей используемых средств операционной системы. Например, на платформе Win32 для останова нити таймера на время тайм-аута используется функция Sleep. Поэтому нить не может "спать" меньше, минимального времени, выделяемого ОС каждой из нитей. Кроме того, необходимо учитывать накладные расходы, связанные с вызовом и возвратом из Sleep. Вполне может оказаться, что пять последовательных вызовов Sleep с параметром 20 миллисекунд потребуют гораздо больше, чем желаемые 100 миллисекунд задержки. Поэтому, может оказаться, что два обращения к Sleep с параметром 50 миллисекунд приведут к более желаемому результату.

На точность простейшего таймера так же оказывает влияние загруженность ОС (например, количество нитей работающих на высоких приоритетах). Для того, чтобы таймер не зависел от нитей с низким приоритетом, после старта нить таймера поднимает свой приоритет. Так, на платформе Win32 выставляется приоритет THREAD_PRIORITY_HIGHEST без именения основного приоритета процесса.

Заметки:
В SObjectizer v.4.1.3 таймерная нить не устанавливает свой приоритет на POSIX-платформах.

В SObjectizer v.4.1.3 величина тайм-аута составляет 250 миллисекунд. Этот темп обеспечивается достаточно точно и устойчиво на всех протестированных платформах. Класс so_4::timer_thread::simple::timer_thread_t позволяет устанавливать произвольную величину тайм-аута, но не гарантирует, что это приведет к желаемой точности.


Документация по SObjectizer. Последние изменения: Thu Jan 12 10:52:50 2006. Создано системой  doxygen 1.4.6-NO
Hosted by uCoz