LINUX.ORG.RU

История изменений

Исправление alysnix, (текущая версия) :

Так себе решение для хай лоад.

ну вы тут просто нереальные сцуко-архитекторы. то что делает таймер(например вызывая хук) при активации должно занимать ПРЕНЕБРЕЖИМО МАЛОЕ ВРЕМЯ по сравнению с тиком таймерной очереди, и разумеется таймер не может вызвать ни одну функцию, что может быть заблокирована, поскольку это остановит обработку очереди таймеров.

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

потому работа таймерной очереди это - последовательная выборка ВСЕХ созревших на данном тике таймеров, активация их хуков (или проброс мессаги в очередь адресата ивента таймера), и либо запихивание таймера обратно в очередь (если стоит признак periodic), либо - забыли о нем и все. то есть фактически тот тред или та активность, что крутит таймеры, тратит основное время только на выборку и вставку в список.

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

Исходная версия alysnix, :

Так себе решение для хай лоад.

ну вы тут просто нереальные сцуко-архитекторы. то что делает таймер(например вызывая хук) при активации должно занимать ПРЕНЕБРЕЖИМО МАЛОЕ ВРЕМЯ по сравнению с тиком таймерной очереди, и разумеется таймер не может вызвать ни одну функцию, что может быть заблокирована, поскольку это остановит обработку очереди таймеров.

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

потому работа таймерной очереди это - последовательная выборка ВСЕХ созревших на данном тике таймеров, активация их хуков (или проброс мессаги в очередь адресата ивента таймера), и либо запихивание таймера обратно в очередь (если стоит признак periodic), либо - забыли о нем и все. то есть фактически тот тред или та активность, что крутит таймеры, тратит основное время только на выборку и вставку в список.

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