boost::asio зависает в деструкторе службы преобразователя после исключения из io_service::run()

StackOverflow https://stackoverflow.com/questions/3324293

Вопрос

Я использую довольно простую настройку boost::asio, где вызываю io_service.run() из основного потока.У меня есть преобразователь TCP, и я использую асинхронное разрешение для поиска адреса.Когда этот поиск завершается неудачно, я вызываю исключение внутри асинхронного обратного вызова.Я улавливаю это исключение вне вызова run() внутри основной функции.Затем я вызываю функцию stop() для своего экземпляра io_service (который является глобальным).Однако когда функция main() возвращается, программа зависает.Оказывается, он ожидает события exit_event_, которое никогда не приходит от службы разрешения.

Я не хочу зависать на выходе.Что-то я делаю не так?Если да, то?Я не нашел большого обсуждения этих вещей в Интернете.Я использую Boost 1.41.0 в Windows 7/64bit.

Это было полезно?

Решение

Затем я вызываю stop() на своем io_service

Попробуйте использовать этот трюк (скопировано из документация io_service) когда тебе нужно остановиться io_service:

boost::asio::io_service io_service;
auto_ptr<boost::asio::io_service::work> work(
    new boost::asio::io_service::work(io_service));
...
work.reset(); // Allow run() to exit. 

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

Итак, вызов io_service::stop() недостаточно, если вам нужно отправить все обработчики.

Другие советы

Стоп () Просто сигнализирует IO_Service, чтобы остановиться.Если вы следуете за вызовите остановки () с другим запуском (), его следует вернуть и убирать правильно.

Есть некоторое обсуждение о бросках исключения из обработчиков в Документация .

Я также догадываюсь, что проблема может быть связана с некоторой проблемой жизни объекта, например,Служба IO разрушается, пока что-то еще по-прежнему ссылается на него.Посмотрите на приведенные примеры и насколько общие указатели используются для обеспечения все еще вокруг объектов.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top