Heim >Backend-Entwicklung >C++ >Wann entsperrt die io_service::run()-Methode von Boost.Asio die Blockierung?
Blockierungs- und Entblockungsbedingungen
Wenn Boost.Asios io_service: :run()-Methode aufgerufen wird, blockiert sie normalerweise, bis eine der folgenden Bedingungen erfüllt ist:
Beachten Sie, dass run() blockiert, wenn keine weiteren Handler zum „Versenden“ vorhanden sind " vom io_service. Ein Handler bezieht sich auf eine Rückruffunktion oder ein Handlerobjekt, das aufgerufen wird, wenn der entsprechende asynchrone Vorgang abgeschlossen ist. Wenn alle geplanten Arbeiten und Handler ausgeführt wurden, betrachtet sich der io_service als inaktiv und ohne ausstehende Vorgänge, was zur Freigabe von run() führt.
Beispiel 1: Synchroner TCP/IP-Client
In dem in Ihrer Frage bereitgestellten Beispielcode blockiert die run()-Methode, weil sie auf den Abschluss eines asynchronen Lesevorgangs wartet. Der Socket ist für den Empfang von Daten von einem Server eingerichtet, und bis Daten vom handle_async_receive-Handler empfangen und verarbeitet werden, bleibt die run()-Methode blockiert.
Beispiel 2: Worker-Thread-Pool
Im zweiten Beispiel wird run() innerhalb von Arbeitsthreads aufgerufen. Das Arbeitsobjekt stellt sicher, dass der io_service auch dann aktiv bleibt, wenn keine geplanten Handler vorhanden sind. Wenn die CalculateFib-Handler an den io_service gesendet werden, werden sie von den Arbeitsthreads ausgeführt. Wenn alle drei Fibonacci-Berechnungen abgeschlossen sind, wird das Arbeitsobjekt zerstört, was dazu führt, dass der io_service keine neue Arbeit mehr akzeptiert. Dadurch wird den Arbeitsthreads signalisiert, dass keine weiteren Aufgaben mehr ausgeführt werden müssen, sodass sie beendet werden können. Folglich entsperrt run() die Blockierung und der Hauptthread kann fortfahren.
Unterschied zwischen Beispiel 1 und 2
Während beide Beispiele asynchrone Vorgänge verwenden, verhält sich das erste effektiv synchron weil es blockiert, bis Daten empfangen werden. Im zweiten Beispiel werden die Worker-Threads parallel ausgeführt, sodass andere Aufgaben verarbeitet werden können, während der io_service auf weitere Arbeit wartet.
Asynchrone und synchrone Vorgänge
Im Allgemeinen ist es ratsam, die Vermischung synchroner und asynchroner Vorgänge zu vermeiden, da dies zu Komplexitäten in Ihrem Code führen kann. Zu den Vorteilen der asynchronen Programmierung gehören:
Das obige ist der detaillierte Inhalt vonWann 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!