Heim > Backend-Entwicklung > C++ > Wann blockiert „boost::asio::io_service::run()'?

Wann blockiert „boost::asio::io_service::run()'?

Linda Hamilton
Freigeben: 2024-11-11 12:17:03
Original
497 Leute haben es durchsucht

When Does `boost::asio::io_service::run()` Block?

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:

  1. io_service::work wird erstellt, um eine sofortige Rückkehr von run() zu verhindern.
  2. Arbeitsthreads werden gestartet, um die io_service-Schleife auszuführen.
  3. Handler für Fibonacci-Berechnungen werden veröffentlicht.
  4. io_service::work wird zurückgesetzt, sodass run() beendet werden kann.
  5. 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:

  1. async_receive() initiiert einen asynchronen Vorgang.
  2. io_service::run() blockiert, bis der Vorgang abgeschlossen ist oder ein Fehler auftritt tritt auf.
  3. 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
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage