Maison >développement back-end >C++ >Quand `boost::asio::io_service::run()` bloque-t-il et débloque-t-il dans les opérations asynchrones ?

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

Barbara Streisand
Barbara Streisandoriginal
2024-11-10 22:07:03266parcourir

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!

Déclaration:
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