таймер — бесконечный цикл против повышения :: asio :: deadline_timer C ++

Я разрабатываю серверное приложение, которое обрабатывает множество соединений от клиентов. Сервер периодически отправляет сообщение каждому клиенту (например, каждую 1 секунду), проверяет время истечения срока действия клиента (каждый клиент должен быть принудительно отключен от сервера, когда время подключения достигает заданного значения) и некоторые другие задачи таймера. Я считаю 2 решения:

  1. используйте while (true) {foreach клиентов {check time}}
  2. для каждого клиента delcare a deadline_timer и вызов async_wait для каждой задачи, поэтому он будет порождать множество экземпляров deadline_timer

Какое решение лучше для производительности? В общем, я должен использовать бесконечный цикл или объявить много экземпляров таймера? И еще, можете ли вы объяснить, как ОС управляет deadline_timer?

2

Решение

Q. Какое решение лучше для производительности?

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

Q. В общем, стоит ли использовать бесконечный цикл

нет

Q. или объявив много экземпляров таймера?

Или просто

std::vector<boost::shared_ptr<asio::deadline_timer> > m_timers;

или похожие 🙂

Q. И еще, можете ли вы объяснить, как ОС управляет deadlien_timer?

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

Примитивы синхронизации на уровне ядра в целом являются самым быстрым способом для рабочих нагрузок, не связанных с ЦП.

2

Другие решения

Требуется ли тайм-аут каждого клиента ровно (или почти) в одну секунду?

Я бы сделал третий способ:

while (true) {
if ( elapsed_one_second() ) {
for each client {
client->check_timeout();
}
}

Или, если у вас есть очередь событий, вы делаете один таймер для запуска проверки всех клиентов.

РЕДАКТИРОВАТЬ:
Если у вас огромное количество таймеров, вы можете также рассмотреть возможность реализации дельта-очереди и использовать однократный таймер для самого раннего события.

1

По вопросам рекламы [email protected]