Il mio codice utilizza boost :: asio e io_service in una singola discussione per eseguire varie operazioni socket. Tutte le operazioni sono asincrone e ogni gestore dipende dallo boost::system::error_code
(in particolare) per determinare il risultato dell'operazione.boost :: gestori async async richiamati senza errori dopo l'annullamento
Ha funzionato perfettamente fino a quando ho modificato la logica per rendere più simultanee connessioni e scegliere quella più veloce. Cioè, quando il primo gestore di async_read_some
si attiva, annullo altri socket (shutdown, close - everything) e procedo con quello corrente. Nel 95% dei casi gli handler di lettura di altri socket vengono richiamati con l'errore operation_aborted. Tuttavia, a volte, questi gestori di lettura vengono richiamati senza errori, dicendomi che hanno ricevuto N byte correttamente.
ma la documentazione per lo zoccolo :: cancel() states:
Questa funzione fa sì che tutti eccezionali asincrono collegare, inviare e ricevere operazioni di finire immediatamente, ei gestori per operazioni annullate saranno superato la Errore
boost::asio::error::operation_aborted
.
Quindi, le domande: Posso davvero fare affidamento sull'errore operation_aborted
nel codice di produzione? Se posso, è un bug in Asio da boost 1.46.1? Se non posso, c'è qualche documentazione ufficiale riguardo a questo?
Sembra nel tuo caso che più gestori abbiano "eseguito l'operazione" prima che l'annullamento sia stato richiamato. Puoi fare affidamento su 'operation_aborted' per essere passato a tutti i gestori che non sono già stati eseguiti (e sono in attesa di essere chiamati). – Chad