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é :
- io_service::work est créé pour empêcher le retour immédiat de run().
- Les threads de travail sont lancés pour exécuter la boucle io_service.
- Les gestionnaires des calculs de Fibonacci sont publiés.
- io_service::work est réinitialisé, permettant à run() de se terminer.
- 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 :
- async_receive() lance une opération asynchrone.
- io_service::run() se bloque jusqu'à ce que l'opération soit terminée ou qu'une erreur se produise se produit.
- 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
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!
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