7

¿Es posible realizar una espera asíncrona (leer: no-bloqueo) en una variable condicional en boost :: asio? si no se admite directamente, se apreciará cualquier sugerencia sobre su implementación.impulsar Asio asíncronamente esperando una variable de condición

Podría implementar un temporizador y activar un despertador incluso cada pocos ms, pero este es un enfoque bastante inferior, me resulta difícil de creer que la sincronización de la variable de condición no esté implementada/documentada.

+0

¿qué quieres hacer ??? - ¿Es la última versión de [async_read_until] (http://www.boost.org/doc/libs/1_47_0/doc/html/boost_asio/reference/async_read_until.html) lo que estás buscando? la espera sin bloqueo es normalmente una tarea para [impulsar el hilo] (http://www.boost.org/doc/libs/1_47_0/doc/html/thread.html) ... impulsar el hilo en combinación con el impulso asio debería funcionar ... – jenseb

+0

Tengo una implementación alternativa en mente, la he resumido en otra pregunta aquí. http://stackoverflow.com/questions/6776779/boost-asio-multi-io-service-rpc-framework-design-rfc Esto podría darle más información sobre lo que quiero lograr. –

Respuesta

7

Si entiendo correctamente la intención, ¿desea iniciar un controlador de eventos, cuando se señaliza alguna variable de condición, en el contexto del grupo de subprocesos asio? Creo que sería suficiente para esperar en la variable de condición en el inicio del controlador, y io_service::post() mismo de vuelta en la piscina al final, algo de este 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

pero el hilo que espera se bloqueará, ¿no hay una forma de no bloquear un hilo, sino registrar un controlador de finalización en su lugar? Actualmente estoy considerando un mecanismo alternativo aquí http://stackoverflow.com/questions/6776779/boost-asio-multi-io-service-rpc-framework-design-rfc –

+0

@Hassan Syed: una variable de condición es un concepto que involucra un hilo bloqueado ¿Quizás estás buscando señales asíncronas en su lugar? boost.asio acaba de agregar soporte para manejadores de señal en 1.47.0: http://www.boost.org/doc/libs/1_47_0/doc/html/boost_asio/history.html – Cubbi

+0

Por lo que puedo decir, estas son señales que son emitidos por el sistema operativo. Se muestra que puede registrarse para estas señales, pero es el sistema operativo el que las emitirá. –

Cuestiones relacionadas