2009-12-30 23 views
14

Estaba revisando el asio chat server example. Mi pregunta es sobre su uso de la función io_service.run(). La documentación de la función io_service.run() dice:boost asio io_service.run()

Los bloques de función run() hasta que todo el trabajo ha terminado y no hay manipuladores más para ser despachados, o hasta que el io_service ha sido se detuvo. Varios hilos pueden llamar a la función run() para configurar un grupo de hilos desde el cual el io_service puede ejecutar manipuladores. Todos los subprocesos que están esperando en el grupo son equivalentes y el io_service puede elegir cualquiera de ellos para invocar un controlador. La función run() se puede llamar de nuevo de manera segura una vez que se ha completado solo después de una llamada a reset().

Dice que la función de ejecución volverá, y supongo que cuando vuelva, el hilo de la red se detiene hasta que se vuelva a llamar. Si eso es cierto, ¿por qué no se llama a la función de ejecución en un bucle, o al menos se le da su propio hilo? la función io_service.run() es un misterio para mí.

+0

Comprobar también la respuesta aquí: http://stackoverflow.com/questions/4705411/boostasio-io-service-run-vs-poll-or-how-do-i-integrate-boostasio-in -ma – serxio

Respuesta

19

"hasta que todo el trabajo ha terminado y no hay más controladores para ser enviados, o hasta que el io_service se ha detenido"

Observe que HACER instalar un controlador, llamado handle_accept, que se reinstala en cada ejecución. Por lo tanto, el io_service.run nunca volverá, al menos hasta que lo abandone manualmente.

Básicamente, en el momento en que ejecuta io_service.run en un hilo, io_services proactor asume el control del flujo del programa, utilizando el controlador que instaló. A partir de ese momento, usted maneja el programa basado en eventos (como el handle_accept) en lugar del flujo de programa de procedimiento normal. El bucle que mencionas está en algún lugar en las profundidades de miedo del proactor de asio ;-).

+0

Pregunta anterior, espero recibir una respuesta aquí ya que esto parece relevante. ¿Qué hay de la situación del cliente donde no hay controlador de aceptar? Estoy intentando escribir un cliente con asio y me estoy atorando sobre cómo encaja el io_service.run(). – Endophage

+0

@Endophage, lo siento, hace mucho tiempo que no trabajo con boost :: asio, así que no puedo encontrar una respuesta desde lo alto de mi cabeza, intente hacer la pregunta de nuevo. –

+0

No hay problema, gracias por dar la vuelta. – Endophage

Cuestiones relacionadas