Wann wird boost::asio::io_service ausgeführt? Blockieren/Entsperren
Das Blockierungsverhalten von io_service::run() ergibt sich aus der Handhabung von Arbeit und Handlern. Es bleibt blockiert, bis:
- Alle Arbeiten abgeschlossen sind
- Es sind keine weiteren Handler mehr zur Ausführung vorhanden
- Der io_service wurde gestoppt über stop()
Entschlüsselung des Satzes „Keine weiteren Handler zu versenden“
Wenn io_service::run() blockiert, bis „keine weiteren Handler zu versenden sind“, bedeutet dies dass keine ausstehenden Aufgaben in Form von registrierten Rückrufen vorliegen.
Verhalten im Beispielcode
Beispiel 3a: Blockieren
Im ersten Beispiel (3a) blockiert der io_service innerhalb von run(), bis alle drei veröffentlichten Fibonacci-Berechnungshandler ausgeführt wurden.
Detaillierter Ausführungsablauf:
- io_service::work wird erstellt, um eine sofortige Rückkehr von run() zu verhindern.
- Arbeitsthreads werden gestartet, um die io_service-Schleife auszuführen.
- Handler für Fibonacci-Berechnungen werden veröffentlicht.
- io_service::work wird zurückgesetzt, sodass run() beendet werden kann.
- Die Worker-Threads werden verbunden, was den Abschluss der Aufgabe anzeigt.
Client-Code: Asynchron, aber effektiv synchron
Der Client-Code scheint asynchrone E/A (async_receive) zu verwenden, aber das ist nicht der Fall verhält sich effektiv synchron:
Ausführungsablauf:
- async_receive() initiiert einen asynchronen Vorgang.
- io_service::run() blockiert, bis der Vorgang abgeschlossen ist oder ein Fehler auftritt tritt auf.
- Die Steuerung kehrt zum aufrufenden Thread zurück und der Handler wird ausgeführt.
Synchronisches Gegenstück:
Die entsprechende synchrone Operation wäre:
boost::asio::error_code error;
std::size_t bytes = socket.receive(buffer, error);
// Execute handler with error and bytes
Allgemeine Richtlinie: Separate synchrone und asynchrone Vorgänge
Das Mischen synchroner und asynchroner Vorgänge kann zu Komplexität führen. Erwägen Sie, diese Praxis zu vermeiden. Die Boost.Asio-Dokumentation bietet wertvolle Einblicke in die Vorteile der asynchronen Programmierung.
Das obige ist der detaillierte Inhalt vonWann blockiert „boost::asio::io_service::run()'?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!
Stellungnahme:Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn