boost::asio se bloque dans le destructeur de service de résolution après avoir jeté io_service::run()

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

Question

J'utilise une configuration boost::asio assez simple, où j'appelle io_service.run() à partir du thread principal.J'ai un résolveur TCP et j'utilise la résolution asynchrone pour rechercher une adresse.Lorsque cette recherche échoue, je lève une exception dans le rappel asynchrone.J'attrape cette exception en dehors de l'appel run(), à l'intérieur de la fonction principale.J'appelle ensuite stop() sur mon instance io_service (qui est globale).Cependant, lorsque main() revient, le programme se bloque.Il s'avère qu'il attend un exit_event_ qui ne vient jamais du service de résolution.

Je ne souhaite pas m'accrocher à la sortie.Y a-t-il quelque chose que je fais de mal ?Si oui, quoi ?Je n'ai pas trouvé beaucoup de discussions sur ces choses en ligne.J'utilise boost 1.41.0 sur Windows 7/64 bits.

Était-ce utile?

La solution

J'appelle ensuite stop() sur mon io_service

Essayez d'utiliser cette astuce (copiée de documentation io_service) quand tu dois t'arrêter 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. 

La raison est simple (également d'après la documentation) :appeler pour io_service::stop() entraînera le retour de l'appel io_service run() dès que possible, abandonnant les opérations inachevées et sans permettre l'envoi des gestionnaires prêts.

Alors, j'appelle io_service::stop() ne suffit pas si vous devez envoyer tous les gestionnaires.

Autres conseils

Stop () Signalise simplement l'io_service de s'arrêter.Si vous suivez l'appel Stop () à l'aide d'un autre appel (), il doit renvoyer et nettoyer correctement.

Il y a quelques discussions sur jeter des exceptions à partir de manipulateurs dans le documentation .

Je devine aussi que la question peut être liée à un problème de vie de l'objet, par exemple.Le service IO est détruit alors que quelque chose d'autre le référencent toujours.Examinez de plus près les exemples et la manière dont les pointeurs partagés sont utilisés pour vous assurer que les objets sont toujours autour.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top