Очистить 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 ответ:
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
завершению также показан здесь.