Asio's io_service
ist der Vermittler für die Arbeit mit asynchronen Funktionen. Sobald eine asynchrone Operation bereit ist, verwendet sie einen der laufenden Threads von io_service
, um Sie zurückzurufen. Wenn kein solcher Thread existiert, verwendet er seinen eigenen internen Thread, um Sie anzurufen.
Betrachten Sie es als eine Warteschlange mit Operationen. Es garantiert Ihnen, dass diese Operationen bei Ausführung nur für die Threads ausgeführt werden, die ihre Methoden run()
oder run_once()
aufgerufen haben, oder wenn es sich um Sockets und asynchrone IO handelt, deren interner Thread.
Der Grund, warum Sie es an alle weitergeben müssen, ist im Grunde, dass jemand auf asynchrone Operationen warten muss, um bereit zu sein, und wie in seiner eigenen Dokumentation io_service
ist ASIO Link zum I/O-Dienst des Betriebssystems, so abstrahiert die weg Plattform eigene Async-Melder, wie kqueue
, /dev/pool/
, epoll
, und die Methoden, um auf denen, wie select()
zu arbeiten.
In erster Linie benutze ich io_service, um Callbacks von mehreren Teilen des Systems zu demultiplexen und sicherzustellen, dass sie auf dem gleichen Thread arbeiten, wodurch die explizite Sperrung entfällt, da die Operationen serialisiert werden. Es ist ein sehr mächtiges Idiom für asynchrone Anwendungen.
Sie können einen Blick auf die core documentation werfen, um ein besseres Gefühl zu bekommen, warum io_service
benötigt wird und was es tut.
'Hauptsächlich benutze ich io_service, um Callbacks aus verschiedenen Teilen des Systems zu demultiplexen und sicherzustellen, dass sie auf dem gleichen Thread arbeiten. (...)' Könntest du bitte etwas über dieses Idiom ausarbeiten? – syntagma
@ ΔλL Sie buchen einfach Operationen auf io_service und wenn die Zeit kommt, dass sie ausgeführt werden, wird es den richtigen Thread auswählen und ausführen, möglicherweise serialisiert, wenn Sie einen Strang verwenden, um die Operationen zu umbrechen. – Berkus