Maison >développement back-end >C++ >Quand la méthode io_service::run() de Boost.Asio se débloque-t-elle ?
Conditions de blocage et de déblocage
Quand io_service de Boost.Asio : :run() est invoquée, elle se bloque généralement jusqu'à ce que l'une des conditions suivantes soit remplie rencontré :
Notez que run() se bloque lorsqu'il n'y a plus de gestionnaires à gérer. "expédié" par le io_service. Un gestionnaire fait référence à une fonction de rappel ou à un objet gestionnaire invoqué lorsque l'opération asynchrone correspondante est terminée. Lorsque tous les travaux et gestionnaires planifiés ont été exécutés, le io_service se considère inactif sans opérations en attente, ce qui entraîne le déblocage de run().
Exemple 1 : Client TCP/IP synchrone
Dans l'exemple de code fourni dans votre question, la méthode run() se bloque car elle attend la fin d'une opération de lecture asynchrone. Le socket est configuré pour recevoir des données d'un serveur, et jusqu'à ce que les données soient reçues et traitées par le gestionnaire handle_async_receive, la méthode run() reste bloquée.
Exemple 2 : Pool de threads de travail
Dans le deuxième exemple, run() est invoqué dans les threads de travail. L'objet de travail garantit que le io_service reste actif même lorsqu'il n'y a aucun gestionnaire planifié. Lorsque les gestionnaires CalculateFib sont publiés sur io_service, ils sont exécutés par les threads de travail. Lorsque les trois calculs de Fibonacci sont terminés, l'objet de travail est détruit, ce qui oblige le io_service à cesser d'accepter de nouveaux travaux. Cela signale aux threads de travail qu'il n'y a plus de tâches à exécuter, ce qui leur permet de se terminer. Par conséquent, run() se débloque et le thread principal peut continuer.
Différence entre les exemples 1 et 2
Bien que les deux exemples utilisent des opérations asynchrones, le premier se comporte effectivement de manière synchrone car il bloque jusqu'à ce que les données soient reçues. Dans le deuxième exemple, les threads de travail s'exécutent en parallèle, permettant à d'autres tâches d'être traitées pendant que le io_service attend plus de travail.
Opérations asynchrones et synchrones
En général , il est conseillé d'éviter de mélanger des opérations synchrones et asynchrones car cela peut entraîner des complexités dans votre code. Les avantages de la programmation asynchrone incluent :
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!