2009-12-21 6 views
9

Je souhaite fournir un io_service global piloté par un thread global. Assez simple, je viens d'appeler le corps du fil io_service::run(). Cependant, cela ne fonctionne pas comme run (run_one, poll, poll_one) retourner s'il n'y a pas de travail à faire. Mais, si le thread appelle de manière répétée run(), il passera en boucle quand il n'y a rien à faire.thread dédié pour io_service :: run()

Je suis à la recherche d'un moyen de bloquer le thread tant qu'il n'y a pas de travail à faire dans le io_service. Je pourrais ajouter un événement global au mélange pour le fil à bloquer. Cependant, cela obligerait les utilisateurs du io_service à notifier l'événement chaque fois qu'ils utilisent le service. Pas la solution idéale.

Remarque: il n'y a pas de globals réels et je n'utilise jamais d'événements pour la simultanéité J'ai simplement simplifié le problème à mon besoin exact. Le véritable objectif est une sous-classe asio::deadline_timer qui ne nécessite pas de io_service comme paramètre de construction.

Répondre

21

Vous devez créer un objet io_service::work.

Voir cette section de la documentation:

Stopping the io_service from running out of work

+0

Je ne savais pas celui-ci. +1, et supprimé ma suggestion hack-ishy. –

+0

merci, j'avais commencé à faire la minuterie avec et le délai d'expiration à cette fin. Je suis perpétuellement impressionné par Asio. Ils ont manqué très peu de cas d'angle. –