2009-12-21 16 views
9

Quiero proporcionar un io_service global que sea controlado por un subproceso global. Bastante simple, solo tengo la llamada del cuerpo del hilo io_service::run(). Sin embargo, eso no funciona como run (run_one, poll, poll_one) devolver si no hay trabajo que hacer. Pero, si el hilo llama repetidamente a run(), estará ocupado cuando no haya nada que hacer.subproceso dedicado para io_service :: run()

Estoy buscando una manera de hacer que el hilo se bloquee mientras que no hay trabajo que hacer en el io_service. Podría agregar un evento global a la mezcla para que el hilo se bloquee. Sin embargo, eso requeriría que los usuarios del io_service notificaran el evento cada vez que usaran el servicio. No es la solución ideal.

Nota: no hay globales reales y nunca uso eventos para concurrencia Simplemente simplifiqué el problema a mi necesidad exacta. El objetivo real es una subclase asio::deadline_timer que no requiere un io_service como parámetro de construcción.

Respuesta

21

Necesita crear un objeto io_service::work.

Ver esta sección de la documentación:

Stopping the io_service from running out of work

+0

no sabía nada de esto. +1, y eliminó mi sugerencia de hack-ishy. –

+0

gracias, comencé a hacer el temporizador con infinito tiempo de espera solo para este propósito. Estoy perpetuamente impresionado con Asio. Se perdieron muy pocos casos de esquina. –