Pregunta

Tengo un pequeño problema con el impulso :: asio biblioteca. Mi aplicación recibir y procesar datos de forma asíncrona, es crear y ejecutar hilos io_service.run () en cada uno de ellos.

boost::asio::io_service io;
boost::thread_group thread_pool;
...
int cpu_cnt = get_cpu_count();
for (int i = 0; i < cpu_cnt; ++i)
{
    thread_pool.create_thread( boost::bind(&run_service, &io) );
}

void run_service(boost::asio::io_service* io)
{
    try
    {
        io->run();//make fun
    }
    catch(const std::exception& e)
    { //process error
    }
    catch(...)
    { //process error
    }
}

Una vez tras otra, mi aplicación recibe el mensaje (a través del sistema de mensajería de Windows) de alguna aplicación de supervisor comprueba que es mi programa vivo o no. Si mi solicitud suele responder, se reinicia. La parte difícil aquí es comprobar, que los hilos se está ejecutando y no en un punto muerto. Me pueden enviar manejador de io_service como esto:

io.post( &reply_to_supervisor );

pero este método afecta sólo un hilo. ¿Cómo puedo comprobar que todos los hilos se está ejecutando y no en un punto muerto?

¿Fue útil?

Solución

Puede que me equivoque, pero me la utilización de un io_service por hilo resolver su problema?

Otra idea: colocar cpu_cnt veces reply_to_supervisor llamadas que utilizan un poco sleep() - no es agradable, pero debería funcionar

Otros consejos

Esto me parece una instancia de la Detener Problema , pero ya que parece ser en Windows, es posible que desee ver en la biblioteca solo hilo :: Solución de Software . Es una implementación del proyecto de C ++ 0x enhebrar la biblioteca, y se ha incorporado en la detección de punto muerto en sus propias exclusiones mutuas.

En última instancia usted es probablemente mejor de hacer esta pregunta en el asio lista de correo . El autor de la biblioteca es muy útil, y ya sea él o algún otro usuario del hardcore asio puede ser capaz de proporcionar una mejor respuesta allí.

Voy a asumir que su io-> run () hace una especie de bucle para esperar a que el asio para completar. También voy a asumir que usted tiene un tiempo de espera en esta operación asio. Una forma de comprobar sucia es tener una carrera hilo de estado y verificar que sea el hilo asio ha agotado el tiempo de espera para el asio para completar o que un evento asio ha sido publicado. De cualquier manera, se establecería una especie de variable o manejar a conocer su hilo está "vivo" y bucle. Su estado de rosca sería entonces comprobar que cada variable / manejar y restablecerlas después de la comprobación.

Eso sí, estoy seguro de que hay otras maneras, pero esto es lo que vino a la mente a partir de ahora ... =)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top