2013-08-31 4 views
5

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

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

ответ

6

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

destructor для io_service заставит все невыполненные обработчики должны быть уничтожены:

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

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

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