У меня 2 вопроса:
В1) Могу ли я реализовать асинхронный таймер в однопоточном приложении, т. Е. Мне нужна такая функциональность.
....
Timer mytimer(5,timeOutHandler)
.... //this thread is doing some other task
...
and after 5 seconds, the timeOutHandler function is invoked.
Насколько я могу подумать, этого нельзя сделать для однопоточного приложения (поправьте меня, если я не прав). Я не знаю, можно ли это сделать с помощью select в качестве демультиплексора, но даже если можно использовать select, для цикла обработки событий потребуется один поток? Не так ли?
Я также хочу знать, могу ли я реализовать таймер (не тайм-аут), используя select.
Select только ожидает набор файловых дескрипторов, но я хочу иметь список таймеров в порядке возрастания их тайм-аутов истечения и хочу select, чтобы сообщить мне, когда истекает первый таймер, и так далее. Таким образом, вопрос сводится к тому, можно ли реализовать асинхронный таймер, используя select / poll или какой-либо другой демультиплексор событий?
Q2) Теперь перейдем ко второму вопросу. Это мой главный вопрос.
Теперь я использую выделенный поток для проверки тайм-аутов, т. Е. У меня есть минимальная куча таймеров (время истечения), и этот поток спит до истечения первого таймера, а затем вызывает обратный вызов.
т.е. код выглядит примерно так
- заблокировать мьютекс
- проверка времени первого таймера
- Условное время ожидания этого времени (и активация, если какой-то другой поток вставляет таймер со временем истечения меньше, чем первый таймер) Условие ожидания разблокирует блокировку.
- После окончания ожидания состояния у нас есть блокировка. Так что разблокируйте его, удалите таймер из кучи и вызовите функцию обратного вызова.
- перейти к 1
Мне нужна временная сложность такого асинхронного таймера. Из того, что я вижу
- Вставка lg (n)
- Срок действия lg (n)
- Аннулирование
:( это вызывает у меня головокружение) проблема в том, что у меня есть минимальная куча таймеров в соответствии с их временем, и когда я вставляю таймер, я получаю уникальный идентификатор. Поэтому, когда мне нужно отменить таймер, мне нужно предоставить этот таймер, и поиск этого таймера в куче в худшем случае займет O (n)
Я не прав?
Можно ли отменить в O (LG N)
Пожалуйста, позаботьтесь о некоторых проблемах с многопоточностью. Я бы уточнил, что я имею в виду под моим предыдущим предложением, как только получу ответы.