2009-04-04 6 views
34

Essayer d'apprendre asio, et je suis les exemples du site Web.io_service, pourquoi et comment est-il utilisé?

Pourquoi io_service est-il nécessaire et que fait-il exactement? Pourquoi ai-je besoin de l'envoyer à presque toutes les autres fonctions tout en effectuant des opérations asynchrones, pourquoi ne peut-il pas "créer" lui-même après la première "liaison".

Répondre

46

Asio io_service est le facilitateur pour fonctionner sur des fonctions asynchrones. Une fois qu'une opération asynchrone est prête, elle utilise l'un des threads en cours d'exécution de io_service pour vous rappeler. Si aucun thread n'existe, il utilise son propre thread interne pour vous appeler. Pensez-y comme une file d'attente contenant des opérations. Il vous garantit que ces opérations, lors de l'exécution, ne le feront que sur les threads qui ont appelé ses méthodes run() ou run_once(), ou lorsqu'il s'agit de sockets et d'E/S asynchrones, son thread interne. La raison pour laquelle vous devez le transmettre à tout le monde est que quelqu'un doit attendre que les opérations asynchrones soient prêtes, et comme indiqué dans sa propre documentation, io_service est le lien d'ASIO au service d'E/S du système d'exploitation. les notificateurs asynchrones propres à la plate-forme, tels que kqueue, /dev/pool/, epoll, et les méthodes pour fonctionner sur ceux-ci, tels que select(). Principalement, je finis par utiliser io_service pour démultiplexer les rappels de plusieurs parties du système, et m'assurer qu'ils fonctionnent sur le même thread, éliminant ainsi le besoin d'un verrouillage explicite, puisque les opérations sont sérialisées. C'est un idiome très puissant pour les applications asynchrones.

Vous pouvez jeter un oeil à la core documentation pour avoir une meilleure idée de pourquoi io_service est nécessaire et ce qu'il fait.

+2

'Principalement, je finis par utiliser io_service pour démultiplexer les rappels de plusieurs parties du système, et m'assurer qu'ils fonctionnent sur le même fil, (...)' Pourriez-vous élaborer un peu sur cet idiome? – syntagma

+0

@ ΔλЛ vous venez de publier des opérations sur io_service et quand les temps viennent pour qu'ils s'exécutent, il va choisir le bon thread et l'exécuter, peut-être sérialisé si vous utilisez un brin pour envelopper les opérations. – Berkus

Questions connexes