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