Maison > développement back-end > C++ > Quand `boost::asio::io_service::run()` bloque-t-il ?

Quand `boost::asio::io_service::run()` bloque-t-il ?

Linda Hamilton
Libérer: 2024-11-11 12:17:03
original
504 Les gens l'ont consulté

When Does `boost::asio::io_service::run()` Block?

Quand boost::asio::io_service exécute-t-il le blocage/déblocage

Le comportement de blocage de io_service::run() découle de sa gestion du travail et des gestionnaires. Il reste bloqué jusqu'à :

  • Tous les travaux sont terminés
  • Il n'y a plus de gestionnaires à exécuter
  • Le io_service a été arrêté via stop()

Déchiffrer l'expression "Plus de gestionnaires à distribuer"

Lorsque io_service::run() bloque jusqu'à ce que "plus de gestionnaires à distribuer", cela signifie qu'il n'y a pas de tâches en suspens sous forme de rappels enregistrés.

Comportement dans l'exemple de code

Exemple 3a : Blocage

Dans le premier exemple (3a), le io_service bloque dans run() jusqu'à ce que les trois gestionnaires de calcul de Fibonacci publiés soient exécutés.

Flux d'exécution détaillé :

  1. io_service::work est créé pour empêcher le retour immédiat de run().
  2. Les threads de travail sont lancés pour exécuter la boucle io_service.
  3. Les gestionnaires des calculs de Fibonacci sont publiés.
  4. io_service::work est réinitialisé, permettant à run() de se terminer.
  5. Les threads de travail se joignent, indiquant l'achèvement de la tâche.

Code client : asynchrone mais effectivement synchrone

Le code client semble utiliser des E/S asynchrones (async_receive), mais il se comporte efficacement de manière synchrone :

Flux d'exécution :

  1. async_receive() lance une opération asynchrone.
  2. io_service::run() se bloque jusqu'à ce que l'opération soit terminée ou qu'une erreur se produise se produit.
  3. Le contrôle revient au thread appelant et le gestionnaire est exécuté.

Homologue synchrone :

L'opération synchrone équivalente serait :

boost::asio::error_code error;
std::size_t bytes = socket.receive(buffer, error);
// Execute handler with error and bytes
Copier après la connexion

Directive générale : opérations synchrones et asynchrones séparées

Le mélange d'opérations synchrones et asynchrones peut introduire de la complexité. Pensez à éviter cette pratique. La documentation Boost.Asio offre des informations précieuses sur les avantages de la programmation asynchrone.

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