Asio und Completion-Handlers



  • Hallo

    wollte die Frage nicht in pumuckls Thread stellen.

    theta schrieb:

    Wenn io_service::run() nur von genau einem Thread angetrieben wird, werden auch die Handler nur genau auf diesem Thread ausgeführt.

    Was ist wenn ein Handler sehr lange braucht und währenddessen mehrere Events gefeuert werden bzw. kann das io_service-Objekt noch Events feuern? Wie verhält sich Asio?

    Danke



  • asioner schrieb:

    wenn ein Handler sehr lange braucht und währenddessen mehrere Events gefeuert werden

    Wenn der Handler nicht selber die "Events feuert" (d.h. irgendwelche async_-Funktionen aufruft) dann gibts in meinem Fall kein "Währenddessen". Bei mehreren Threads, die async_ auf dem selben io_service Objekt aufrufen, kann das aber natürlich sein.

    Wie man sich den io_service vorstellen muss: neben den Möglichkeiten für den ganzen async_*-Krempel hat der io_service eine queue an "ToDo-Objekten", die entweder direkt per post() an die queue gehängt werden, oder aber wenn eine asynchrone Operation fertig ist, dann wird der übergebene Handler mit seinen Argumenten an die queue gehängt. Wenn jetzt ein Handler oder ein anderes der "ToDo-Objekte" extrem lange braucht, kann es eben sein, dass die queue ordentlich wächst. Im schlimmsten Fall wächst sie im Schnitt schneller als der Thread mit dem io_service::run()-Aufruf sie abarbeiten kann, dann dauert das Programm eine kleine Ewigkeit, laggt und macht irgendwann wegen Speicherproblemen die Grätsche (Die ToDo-Objekte brauchen auch Speicher.)


Log in to reply