boost :: asio зависает в деструкторе службы резолвера после выброса из io_service :: run () - PullRequest
2 голосов
/ 24 июля 2010

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

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

Ответы [ 2 ]

1 голос
/ 09 сентября 2011

Затем я вызываю 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() недостаточно, если вам нужно отправить все обработчики.

0 голосов
/ 09 сентября 2011

stop () просто сигнализирует io_service об остановке.Если вы выполняете вызов stop () с помощью другого вызова run (), он должен вернуться и очиститься должным образом.

В документации .

обсуждается вопрос об исключении из обработчиков

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...