7

E 'possibile eseguire un'attesa asincrona (leggi: non bloccante) su una variabile condizionale in boost :: asio? se non è supportato direttamente, qualsiasi accenno alla sua implementazione sarebbe apprezzato.boost asio in attesa asincrona su una variabile di condizione

Potrei implementare un timer e attivare un wakeup anche ogni pochi ms, ma questo è un approccio di gran lunga inferiore, trovo difficile credere che la sincronizzazione delle variabili di condizione non sia implementata/documentata.

+0

cosa vuoi fare ??? - è forse l'ultima versione di [async_read_until] (http://www.boost.org/doc/libs/1_47_0/doc/html/boost_asio/reference/async_read_until.html) che cosa stai cercando? l'attesa non bloccante è normalmente un compito per [boost thread] (http://www.boost.org/doc/libs/1_47_0/doc/html/thread.html) ... aumentare il thread in combinazione con boost asio dovrebbe funzionare ... – jenseb

+0

Ho in mente un'implementazione alternativa, l'ho delineato in un'altra domanda qui. http://stackoverflow.com/questions/6776779/boost-asio-multi-io-service-rpc-framework-design-rfc Questo potrebbe darti maggiori informazioni su ciò che voglio ottenere. –

risposta

7

Se ho compreso correttamente l'intento, si desidera avviare un gestore di eventi, quando viene segnalata una variabile di condizione, nel contesto del pool di thread asio? Penso che sarebbe sufficiente attendere sulla condizione variabile all'inizio del gestore, e io_service::post() si torna in piscina, alla fine, qualcosa di questo tipo:

#include <iostream> 
#include <boost/asio.hpp> 
#include <boost/thread.hpp> 
boost::asio::io_service io; 
boost::mutex mx; 
boost::condition_variable cv; 
void handler() 
{ 
    boost::unique_lock<boost::mutex> lk(mx); 
     cv.wait(lk); 
    std::cout << "handler awakened\n"; 
    io.post(handler); 
} 
void buzzer() 
{ 
    for(;;) 
    { 
     boost::this_thread::sleep(boost::posix_time::seconds(1)); 
     boost::lock_guard<boost::mutex> lk(mx); 
      cv.notify_all(); 
    } 
} 
int main() 
{ 
    io.post(handler); 
    boost::thread bt(buzzer); 
    io.run(); 
} 
+4

ma il thread che attende verrà bloccato, non c'è un modo per non bloccare un thread, ma invece registrare un gestore di completamento? Attualmente sto cercando un meccanismo alternativo qui http://stackoverflow.com/questions/6776779/boost-asio-multi-io-service-rpc-framework-design-rfc –

+0

@Hassan Syed: una variabile di condizione è un concetto che implica una discussione bloccata. Forse stai invece cercando segnali asincroni? boost.asio ha appena aggiunto il supporto per i gestori di segnale in 1.47.0: http://www.boost.org/doc/libs/1_47_0/doc/html/boost_asio/history.html – Cubbi

+0

Per quanto posso dire, questi sono segnali che vengono emessi dal sistema operativo. È dimostrato che è possibile registrarsi per questi segnali, ma è il sistema operativo che li emetterà. –