Qualcuno ha un buon puntatore agli esempi che usano futures from the Boost thread library con Boost ASIO? Ho una libreria asincrona esistente che usa la funzione di callback che mi piacerebbe fornire per un'interfaccia sincrona più amichevole.Utilizzo di future con boost :: asio
risposta
È difficile fornire una soluzione concisa senza comprendere le interazioni con la libreria asincrona esistente. Tuttavia, questo answer utilizza Boost.Future e Boost.Asio per implementare un modello Oggetto attivo. Quando creating a future
, prendere in considerazione la biblioteca asincrono esistente per determinare quale approccio è più appropriato:
- boost::packaged_task fornisce un funtore che può creare un
future
. Questo functor può essere eseguito nel contesto di Boost.Asioio_service
. Potrebbe essere necessario un ulteriore livello di wrapping per integrarsi con la libreria asincrona esistente e per aggirare la semantica rvalue. Considerare l'utilizzo di questo approccio se la funzione corrente chiama già restituire il valore. - boost::promise fornisce un oggetto di livello inferiore che può avere il suo valore impostato. Potrebbe essere necessario modificare le funzioni esistenti per accettare lo
promise
come argomento e popolarlo all'interno della funzione. Lopromise
sarebbe associato al gestore fornito a Boost.Asioio_service
. Come conboost::packaged_task
, potrebbe essere necessario un ulteriore livello di wrapping per gestire la semantica rvalue.
Infine, Boost.Asio 1.54 (attualmente in versione beta) fornisce supporto di prima classe per C++ futures. Ecco il numero ufficiale example. Anche se non sei in grado di utilizzare attualmente la versione 1.54 beta, potrebbe essere utile esaminare l'interfaccia e l'implementazione.
Potete per favore guarda questo esempio:
http://www.boost.org/doc/libs/1_61_0/doc/html/boost_asio/example/cpp11/futures/daytime_client.cpp
Essa mostra come utilizzare std::future
con boost ASIO.
Il punto chiave è quello di includere il file use_future.hpp
:
#include <boost/asio/use_future.hpp>
Quindi è possibile scrivere codice così:
std::future<std::size_t> my_future =
my_socket.async_read_some(my_buffer, boost::asio::use_future);
Se è necessario utilizzare boost::future
quindi suggerirei di implementare un'altra variante , simile a boost::asio::use_future
.
Il file use_future.hpp
è un buon esempio per questo.
questo non funziona mai, fa sì che asio blocchi per sempre – madduci
beh, tale soluzione viene utilizzata attivamente sul mio progetto. E funziona. Sei sicuro di conoscere davvero il motivo del blocco di asio nel tuo caso? –
Apparentemente quel codice nei blocchi di esempio in ogni futuro. Qual è il punto di usare i futures se si blocca su ognuno di essi? Potresti anche usare il codice di blocco in primo luogo ... – kralyk