Boost :: ASIO si blocca nel distruttore del servizio di risoluzione dopo aver buttato fuori da io_service :: run ()

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

Domanda

Sto usando un boost abbastanza semplice :: Asio Set-up, dove chiamo io_service.run () dal thread principale. Ho un resolver TCP e utilizzare Async Desoli per cercare un indirizzo. Quando quella ricerca fallisce, lancio un'eccezione all'interno della richiamata asincrona. Prendo questa eccezione al di fuori della chiamata RUN (), all'interno della funzione principale.Quindi chiamiamo STOP () sulla mia istanza IO_Service (che è globale). Tuttavia, quando il principale () ritorna, il programma si blocca.Si scopre che aspetta un exit_event_ che non viene mai dal servizio Resolver.

Non desidero appendere all'uscita.C'è qualcosa che sto sbagliando?E quindi?Non ho trovato molte discussioni su queste cose online. Sto usando Boost 1.41.0 su Windows 7/64 bit.

È stato utile?

Soluzione

.

Ho quindi chiamato Stop () sul mio io_service

Prova a utilizzare questo trucco (copiato da Documentazione IO_Service ) quando è necessario interrompere 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. 
.

Il motivo è semplice (anche dalla documentazione): chiama a io_service::stop() causerà la spedizione di IO_Service Run () per tornare il prima possibile, abbandonando le operazioni incomplete e senza spedire la spedizione.

Quindi, chiamare io_service::stop() non è sufficiente se è necessario inviare tutti i gestori.

Altri suggerimenti

stop () Segna a segnali lo io_service per fermarsi.Se segui la chiamata STOP () con un'altra versione (), la chiamata dovrebbe tornare e ripulire correttamente.

C'è qualche discussione sul lancio di eccezioni da gestori in Documentazione .

Indovina anche la questione potrebbe essere correlata a qualche problema di durata dell'oggetto, ad es.Il servizio IO viene distrutto mentre qualcos'altro lo sta ancora facendo riferimento.Dai un'occhiata più da vicino agli esempi e come vengono utilizzati i puntatori condivisi per garantire che gli oggetti siano ancora in circolazione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top