Я разрабатываю серверное приложение, которое обрабатывает множество соединений от клиентов. Сервер периодически отправляет сообщение каждому клиенту (например, каждую 1 секунду), проверяет время истечения срока действия клиента (каждый клиент должен быть принудительно отключен от сервера, когда время подключения достигает заданного значения) и некоторые другие задачи таймера. Я считаю 2 решения:
Какое решение лучше для производительности? В общем, я должен использовать бесконечный цикл или объявить много экземпляров таймера? И еще, можете ли вы объяснить, как ОС управляет deadline_timer?
Q. Какое решение лучше для производительности?
Бесконечные циклы обычно плохие. Исключения можно найти у работников, насыщающих ЦП и имеющих сходство с потоками (но здесь это не применимо).
Q. В общем, стоит ли использовать бесконечный цикл
нет
Q. или объявив много экземпляров таймера?
Или просто
std::vector<boost::shared_ptr<asio::deadline_timer> > m_timers;
или похожие 🙂
Q. И еще, можете ли вы объяснить, как ОС управляет deadlien_timer?
Таймеры используют события ядра конкретной платформы, под капотом. Это означает на практике, что если у вас есть, например, Если все задачи заблокированы на разных таймерах, ядро будет держать процесс в спящем состоянии (вообще не запускаться) до истечения срока действия первой.
Примитивы синхронизации на уровне ядра в целом являются самым быстрым способом для рабочих нагрузок, не связанных с ЦП.
Требуется ли тайм-аут каждого клиента ровно (или почти) в одну секунду?
Я бы сделал третий способ:
while (true) {
if ( elapsed_one_second() ) {
for each client {
client->check_timeout();
}
}
Или, если у вас есть очередь событий, вы делаете один таймер для запуска проверки всех клиентов.
РЕДАКТИРОВАТЬ:
Если у вас огромное количество таймеров, вы можете также рассмотреть возможность реализации дельта-очереди и использовать однократный таймер для самого раннего события.