Esto está relacionado de alguna manera con this question, pero creo que necesito saber un poco más. He estado tratando de entender cómo hacerlo durante unos días (mientras trabajo en otras partes), pero ha llegado el momento para que muerda la bala y se multiplique. Además, estoy buscando un poco más de información que la pregunta vinculada.boost :: asio, hilos y sincronización
En primer lugar, sobre multi-threading. Como he estado probando mi código, no me he molestado con ningún multi-threading. Es solo una aplicación de consola que inicia una conexión a un servidor de prueba y luego se maneja todo lo demás. El bucle principal es la siguiente:
while(true)
{
Root::instance().performIO(); // calls io_service::runOne();
}
Cuando escribo mi solicitud principal, supongo que esta solución no será aceptable (ya que tendría que ser llamado en el bucle de mensajes que, aunque posible, tendría problemas cuando la cola de mensajes bloquea la espera de un mensaje. Puede cambiarlo para que el bucle de mensaje no se bloquee, pero ¿no va a golpear el uso de la CPU por el techo?)
La solución parece es arrojarle otro hilo. Bien vale. Pero luego he leído que io_service::run()
regresa cuando no hay trabajo por hacer. ¿Que es eso? ¿Es eso cuando no hay datos, o no hay conexiones? Si existe al menos una conexión, ¿permanece viva? Si es así, no es un problema, ya que solo tengo que iniciar un nuevo hilo cuando se realiza la primera conexión y estoy contento si todo se detiene cuando no hay nada en absoluto. Supongo que estoy confundido por la definición de "no hay trabajo que hacer".
Luego tengo que preocuparme por la sincronización de mi hilo de impulso con mi hilo principal de GUI. Entonces, supongo que mis preguntas son:
- ¿Cuál es la mejor manera de usar boost :: asio en una aplicación cliente con respecto a los hilos y mantenerlos vivos?
- Al escribir en un socket desde el hilo principal al hilo IO, ¿se logra la sincronización utilizando
boost::asio::post
, de modo que la llamada se realice más tarde en el io_service? - Cuando se reciben los datos, ¿cómo devuelve la gente la información al hilo de la interfaz de usuario? En el pasado, cuando usaba puertos de finalización, hice un evento especial que podría volver a publicar los datos en el hilo principal de UI usando un :: SendMessage. No fue elegante, pero funcionó.
Hoy leeré algo más, pero sería genial obtener un aviso de alguien que ya ha hecho esto. La documentación de Boost :: asio no es excelente, y la mayor parte de mi trabajo hasta ahora se ha basado en un poco de la documentación, algunas pruebas/errores, algún código de ejemplo en la web.
+1 io_service :: work es cómo yo mismo resuelvo este problema. –
gracias por su respuesta. Cuando dice que hay varias posibilidades, ¿cuáles son las que ha usado en el pasado? –
@ Moo-Juice, no he estado en una situación en la que haya un hilo de GUI específico que necesite manejar los datos. Acabo de utilizar el mecanismo de devolución de llamada y manejar los datos de un hilo io_service a medida que entró.Alguna forma de cola de mensajes que los subprocesos GUI leen, podría usarse para indicar la llegada de nuevos datos. O simplemente podría usar una variable condicional. Realmente depende de tu aplicación, diseño y requisitos. –