Maison > développement back-end > C++ > le corps du texte

Quand `boost::asio::io_service::run()` bloque-t-il et débloque-t-il dans les opérations asynchrones ?

Barbara Streisand
Libérer: 2024-11-10 22:07:03
original
219 Les gens l'ont consulté

When Does `boost::asio::io_service::run()` Block and Unblock in Asynchronous Operations?

Confondu lorsque la méthode d'exécution boost::asio::io_service bloque/débloque

Dans Boost.Asio, io_service::run() La méthode est responsable du traitement du travail et de l’appel des gestionnaires associés au io_service. Lorsqu'un thread appelle run(), il se bloque généralement jusqu'à ce que :

  • Tous les travaux et tous les gestionnaires soient terminés
  • Le io_service est arrêté (via stop())
  • Une exception est levée à partir d'un gestionnaire

Gestionnaire : Un gestionnaire est une fonction de rappel qui est invoquée lorsqu'une opération asynchrone se termine.

Dans l'exemple 3a :
La méthode io_service::run() bloque les threads de travail jusqu'à ce que les calculs de Fibonacci (gestionnaires) soient terminés. L'objet io_service::work garantit que io_service a toujours du travail à faire, empêchant les threads de travail de se fermer. Une fois le travail terminé, les threads se rejoignent.

Dans le code de la question :
io_service::run() se bloque jusqu'à ce que l'opération de lecture soit terminée. Dès que le gestionnaire de lecture est invoqué, io_service::run() renvoie.

Différences et points clés :

  • L'exemple 3a utilise io_service::work pour empêcher io_service::run() de revenir immédiatement en raison d'un manque de travail.
  • Le code de question n'utilise pas io_service::work.
  • Les deux exemples reposent sur des opérations asynchrones pour effectuer le Fibonacci calculs.
  • Dans le code de la question, io_service::run() peut revenir avant que les opérations asynchrones ne soient terminées (en raison de l'appel du gestionnaire).

Synchronous vs. Asynchrone

Bien que le code de question utilise des opérations asynchrones, il se comporte efficacement comme du code synchrone car io_service::run() attend la fin de l'opération asynchrone. Mélanger des opérations synchrones et asynchrones peut conduire à de la complexité.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal