Очистить boost::asio:: IO сервис после остановки()


Я использую (однопоточный) a boost::asio:io_service для обработки большого количества tcp-соединений. Для каждого соединения я использую deadline_timer, чтобы поймать тайм-ауты. Если какое-либо из соединений истекает, я не могу использовать результаты других соединений. Поэтому я хочу полностью перезапустить свой io_service. Я думал, что вызов io_service.stop() позволит вызвать" готовые " обработчики в очереди и вызовет обработчики в очереди с ошибкой.

Однако похоже, что обработчики остаются в очереди и поэтому вызов io_service.reset() и позже io_service.run() возвращает старые обработчики обратно. Может ли кто-нибудь подтвердить, что обработчики действительно остаются в очереди даже после вызова io_service.stop(). И если да, то каковы возможности для полного сброса io_service, например, удалить все обработчики очереди?

1 5

1 ответ:

io_service::stop() и еще io_service::reset() контролируйте только состояние цикла событий io_service; ни один из них не влияет на срок службы обработчиков, запланированных для отложенного вызова (ready-to-run) или определяемых пользователем объектов обработчика.

Деструктор для io_service приведет к уничтожению всех выдающихся обработчиков:

  • каждый объект сервиса, связанный с io_service, будет иметь свою shutdown_service() вызываемую функцию-член. Согласно требованию типа Service , shutdown_service() функция-член уничтожит все копии определяемых пользователем объектов обработчика, которые хранятся в службе.
  • Незваные объекты обработчика, запланированные для отложенного вызова, уничтожаются для io_service и любой из его нитей.

Рассмотрим либо:

  • управление продолжительностью жизни объекта io_service. Один из подходов можно найти в этом ответе.
  • запуск io_service до завершения. Это часто требует установки состояния, отмены невыполненных операций, и предотвращение размещения обработчиками завершения дополнительной работы в io_service. Повышать.Asio предоставляет официальный пример timeout , и подход timeout с запуском к io_service завершению также показан здесь.