2013-06-24 5 views

risposta

7

È 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.Asio io_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. Lo promise sarebbe associato al gestore fornito a Boost.Asio io_service. Come con boost::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.

4

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.

+0

questo non funziona mai, fa sì che asio blocchi per sempre – madduci

+1

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? –

+0

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