Warum brauche ich pro Verbindung bei boost :: asio einen Strang?
Ich bin überprüfung HTTP-Server 3 Beispiel auf der Boost-website.
Könntet Ihr denn bitte erklären, warum ich brauche strand
pro Verbindung ? Wie ich sehen kann, nennen wir read_some
nur im handler-lese-Veranstaltung. Also im Grunde read_some
Anrufe sequentiell daher gibt es keine Notwendigkeit für die Ausrichtung (und Artikel 2 der 3. Absatz sagt das gleiche). Wo ist das Risiko in multi-threading-Umgebung?
InformationsquelleAutor der Frage expert | 2012-10-09
Du musst angemeldet sein, um einen Kommentar abzugeben.
In der Dokumentation korrekt ist. Mit einer halb-duplex-Protokoll-Implementierung, wie HTTP-Server 3die
strand
ist nicht notwendig. Der Aufruf Ketten lassen sich wie folgt veranschaulichen:Wie in der Abbildung dargestellt, nur eine einzelne asynchrone Ereignis wird gestartet, pro Weg. Ohne die Möglichkeit der gleichzeitigen Ausführung der Handler oder Operationen auf
socket_
es wird gesagt, die ausgeführt werden, um eine implizite Strang.Thread-Sicherheit
Während es sich nicht als ein Problem in dem Beispiel, ich möchte hervorheben, dass ein wichtiges detail der Stränge und komponiert Operationen, wie
boost::asio::async_write
. Vor der Erläuterung der details, können zuerst decken Sie die thread-Sicherheit Modell mit Boost.Asio. Für die meisten Boost.Asio-Objekte, ist es sicher, um mehrere asynchrone Operationen während auf ein Objekt; es ist nur angegeben, dass Anrufe gleichzeitig auf das Objekt zu unsicher sind. In den folgenden Abbildungen repräsentiert jede Spalte einen thread und jede Zeile steht für was ein thread wird zu einem moment in der Zeit.Ist es sicher für einen einzigen thread zu machen, sequenzielle Aufrufe, während andere threads machen keine:
Ist es sicher für mehrere threads, um Anrufe zu tätigen, aber nicht gleichzeitig:
Allerdings ist es nicht sicher für mehrere threads zu telefonieren gleichzeitig1:
Stränge
Um zu verhindern, dass konkurrierende Aufrufe von Prozeduren werden oft aufgerufen wurden innerhalb der Stränge. Dies geschieht entweder durch:
Strang.wrap
. Das liefert einen neuen handler, wird der Versand durch den Strang.Komponiert Operationen sind einzigartig, Zwischenstopp, um die stream sind aufgerufen, innerhalb der handler's Strang, wenn vorhanden, statt der Strang, in welchem die komponierte operation eingeleitet wird. Im Vergleich zu anderen Operationen, stellt dies eine Umkehrung, wo der Strang angegeben ist. Hier finden Sie einige Beispiel-code, mit Schwerpunkt auf strand-Nutzung, die, die demonstrieren wird, einen socket, von dem gelesen über eine nicht-bestehend aus Betrieb, und gleichzeitig geschrieben, mit einer verfassten Betrieb.
Bedeutung von Handler-Typen
Auch innerhalb komponiert Operationen zu Steigern.Asio verwendet argument dependent lookup (ADL) zum aufrufen intermediate-Handler durch den Abschluss hf Litze. Als solche, es ist wichtig, dass die Abschluss-handler-Typ hat die entsprechenden
asio_handler_invoke()
Haken. Wenn der Typ auf Löschung tritt ein Typ, der nicht über die entsprechendenasio_handler_invoke()
Haken, wie ein Fall, wo einboost::function
konstruiert wird, ist von der Rückgabe-Typ vonstrand.wrap
dann ist Mittelstufe-Handler ausgeführt wird, außerhalb der strand, und nur der Abschluss-handler wird ausgeführt, innerhalb des Strangs. Sehen diese Antwort für weitere details.In den folgenden code, alle zwischen Handler und der completion handler wird ausgeführt, innerhalb des Strang:
In den folgenden code, nur der Abschluss-handler wird ausgeführt, innerhalb des Strangs. Keines der intermediate-Handler wird ausgeführt, innerhalb des Strang:
1. Die revision history Dokumente eine Abweichung von dieser Regel. Mit der Unterstützung durch das OS, synchrone Lesen, schreiben, akzeptieren und die Verbindung Operationen thread-sicher. Ich ein wie es hier der Vollständigkeit halber, aber empfehlen es mit Vorsicht.
InformationsquelleAutor der Antwort Tanner Sansbury
Ich glaube, dass es ist, weil die zusammengesetzt Betrieb async_write.
async_write
besteht aus mehreren socket::async_write_some asynchron. Strang ist hilfreich, um die Serialisierung von diesen Vorgängen. Chris Kohlhoff, der Autor von asio, spricht über die er kurz in seinem boostcon sprechen bei etwa 1:17.InformationsquelleAutor der Antwort Vikas