io_service::run() initiiert die Ereignisschleife und verarbeitet ein- und ausgehende Netzwerkereignisse. Es blockiert, bis bestimmte Bedingungen erfüllt sind:
Handler sind Rückrufe, die von aufgerufen werden io_service, um asynchrone Vorgänge auszuführen oder Ereignisse zu verarbeiten. Asynchrone Vorgänge, die mit async_-Funktionen initiiert werden, erzeugen Arbeit für den io_service.
Blockieren von Ereignissen:
io_service::run( ) blockiert, wenn Arbeit zu erledigen oder Handler zu versenden sind. Zum Beispiel:
Ereignisse entsperren:
io_service::run() entsperrt, wenn alle der folgenden Bedingungen erfüllt sind:
Wenn socket.async_receive () aufgerufen wird, wird dem io_service Arbeit hinzugefügt, um Daten aus dem Socket zu lesen. io_service::run() blockiert, bis die Daten empfangen werden oder ein Fehler auftritt, und wartet auf den Aufruf des handle_async_receive-Rückrufs.
Im Beispiel 3a, io_service::work wird verwendet. Dieses Objekt verhindert, dass io_service keine Arbeit mehr hat, und stellt sicher, dass die Threads, die io_service::run() ausführen, weiterhin ausgeführt werden. Wenn das Arbeitsobjekt zerstört wird, geht dem io_service die Arbeit aus und io_service::run() entsperrt.
Es wird allgemein empfohlen, die Vermischung von synchronen und asynchronen Vorgängen zu vermeiden . Dadurch kann der Code komplexer und schwerer verständlich werden. Synchrone Vorgänge können mit den async_-Funktionen von Boost.Asio in asynchrone umgewandelt werden.
Das obige ist der detaillierte Inhalt vonWann blockiert oder entsperrt die io_service::run()-Methode von Boost.Asio die Blockierung?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!