Maison >développement back-end >C++ >Quand la méthode io_service::run() de Boost.Asio bloque-t-elle ou débloque-t-elle ?
io_service::run() lance le boucle d'événements et traite les événements réseau entrants et sortants. Il se bloque jusqu'à ce que certaines conditions soient remplies :
Les gestionnaires sont des rappels invoqués par io_service pour effectuer des opérations asynchrones ou traiter des événements. Les opérations asynchrones, initiées à l'aide des fonctions async_, créent du travail pour le io_service.
Événements de blocage :
io_service::run( ) bloque lorsqu'il y a du travail à effectuer ou des gestionnaires à répartir. Par exemple :
Événements de déblocage :
io_service::run() se débloque lorsque toutes les conditions suivantes sont remplies sont rencontrés :
Lorsque socket.async_receive() est appelé, le travail est ajouté au io_service pour lire les données du socket. io_service::run() bloquera jusqu'à ce que les données soient reçues ou qu'une erreur se produise, en attendant que le rappel handle_async_receive soit invoqué.
Dans l'exemple 3a, io_service :: work est utilisé. Cet objet empêche io_service de manquer de travail, garantissant que les threads exécutant io_service::run() continueront à s'exécuter. Lorsque l'objet de travail est détruit, le io_service manque de travail et io_service::run() se débloque.
Il est généralement recommandé d'éviter de mélanger des opérations synchrones et asynchrones . Cela peut rendre le code plus complexe et difficile à comprendre. Les opérations synchrones peuvent être converties en opérations asynchrones à l'aide des fonctions async_ de Boost.Asio.
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!