boost asio io_service.run ()
Je viens d'aller sur le asio serveur de chat exemple. Ma question est au sujet de leur utilisation de la io_service.run()
fonction. La documentation pour la io_service.run()
fonction dit:
La fonction run() bloque jusqu'à ce que tout le travail est terminé et il n'y a pas
plus les gestionnaires à être distribué, ou jusqu'à ce que le io_service a été
arrêté. Plusieurs threads peuvent appeler la fonction run() pour définir un
pool de threads à partir de laquelle le io_service peut exécuter des gestionnaires. Tous
les threads sont en attente dans la piscine sont équivalentes et la io_service
peut choisir l'un d'eux pour appeler un gestionnaire. La fonction run()
peut être appelé en toute sécurité à nouveau une fois qu'il a terminé qu'après un appel à
reset().
Il est dit que la fonction d'exécution sera de retour, et je suppose que quand il ne le réseau thread s'arrête jusqu'à ce qu'il est appelé à nouveau. Si cela est vrai, alors pourquoi ne pas l'exécution de la fonction appelée dans une boucle, ou au moins compte tenu de son propre thread? le io_service.run()
fonction est un peu un mystère pour moi.
source d'informationauteur Chris H
Vous devez vous connecter pour publier un commentaire.
"jusqu'à ce que le travail est terminé et il n'y a plus les gestionnaires à être distribué, ou jusqu'à ce que le io_service a été arrêté"
Avis que vous NE installer un gestionnaire, appelé
handle_accept
qui se réinstalle à chaque exécution. Par conséquent, laio_service.run
ne reviendra jamais, au moins jusqu'à ce que vous quittez manuellement.Fondamentalement, au moment où vous exécutez io_service.exécuter dans un thread, io_services proactor prend plus de flux de programme, à l'aide de son maître que vous avez installés. À partir de ce moment, vous permet de gérer le programme basé sur des événements (comme le
handle_accept
) au lieu de la normale de la procédure de déroulement du programme. La boucle que tu mentionnes est quelque part profondément dans l'effrayant profondeurs de l'asio est proactor ;-).