[boost::asio] Asynchrone Funktionen und Non-Blocking IO
-
Hi!
Ich beschäftige mich in der Firma mit asio und habe mir die Examples angeschaut. Soweit bin ich recht begeistert von asio, leider ist mir eine Sache noch nicht ganz klar.
Soweit wie ich das verstanden haben, verwenden die asynchronen Fumktionen keine Threads im Hintergrund sondern lösen das über ein elegantes Pattern. Wo liegt aber genau der Unterschied zwischen Non-Blocking IO Funktionen auf einem Socket und den asynchronen Funktionen? Beide kehren sofort zurück und ich diese somit für einen Full Duplex Server verwenden!? Oder übersehe ich etwas?
Vielen Dank im Voraus!
-
Non-blocking IO = reactive IO = recv(100) aufrufen, und sofort 0, 1, 5 ... 100 Byte (oder Fehler) bekommen. Und doof mit select() rumwursteln, um rauszubekommen, bei welchen Sockets es Daten zu holen gibt.
Asio = proactive IO = async_recv(100, handler) aufrufen, und handler() wird dann vom System/der Library/... aufgerufen, nachdem alle 100 Byte gelesen wurden (oder ein Fehler aufgetreten ist).
-
Danke!
Das bedeutet also, dass asio zwar die Möglichkeit für NBIO anbietet, man diese aber dank den asynchronen Funktionen eigentlich gar nicht benötigt? Man kann damit also genau das gleiche wie mit NBIO erreichen, nur bequemer.
-
Du kannst mit Asio blocking, reactive und proactive arbeiten.
Um reactive zu arbeiten, muss man allerdings etwas basteln. Ist aber nicht schlimm, und auch in der Asio Doku beschrieben.
Und i.A. finde ich es angenehmer proactive zu arbeiten.BTW: die Asio thread-safe zu verwenden ist nicht so simpel wie es anfangs erscheinen mag (ausser natürlich man verwendet nur einen einzigen Thread, oder ein eigenes io_service Objekt pro Thread -- was aber beides Nachteile hat). Vor allem wenn man Verbindungen serverseitig zu einem beliebigen Zeitpunkt trennen können möchte (was IMO fast immer erwünscht ist). Dann muss man nämlich irgendwie synchronisieren, da man nicht einfach "close" auf einen Stream aufrufen darf, der evtl. gleichzeitig von anderen Threads verwendet wird. Und das heisst dann normalerweise dass man "Strands" verwenden muss (wenn man sich nicht selbst was stricken möchte, was aber wohl noch erheblich mehr Aufwand sein würde, als die eingebauten Strands zu verwenden).
-
Besten Dank für die Informationen!