2015-06-30 7 views
5

Das folgende Schema von Boost Asio Dokumentation kommen:Was sind die Auswirkungen des Aufrufs io_service :: run-Methode zweimal

enter image description here

Ich verstehe, dass, wenn ich rufe io_service::run Methode zweimal (in zwei separaten Threads), I wird zwei Threads haben, um Events aus der Completion Event Queue via Asynchronous Event Demultiplexer zu entziehen.

Genauer gesagt, ist mein Zweifel auf die Parallelisierung durch mehrere Aufrufe von io_service::run Methode erreichen. Zum Beispiel, wenn ich mit Socket, wenn zum Beispiel habe ich zwei Sockets an der gleichen io_service object gebunden, jede Steckdose Aufruf socket.async_read_some Methode, ist es beteiligt die 2 registrierte Rückrufe (über async_read_some Methode) kann aufgerufen werden, wenn io_service::run zweimal aufrufen.

+1

Sie verstehen es richtig. Hier ist ein nützlicher Link, der es im Detail erklärt: http://theboostcpplibraries.com/boost.asio-scalability –

Antwort

4

Ihre Annahmen sind richtig. Jeder Thread, der io_service::run() aufruft, entnimmt und führt Handler (einfache Funktionsobjekte) parallel aus. Dies ist natürlich nur sinnvoll, wenn Sie mehr als eine Quelle von Ereignissen haben, die den io_service versorgen (wie zB zwei Sockets, ein Socket und ein Timer, mehrere gleichzeitige Aufrufe usw.).

Jeder Anruf an einen Socket async_read() führt dazu, dass genau ein Handler in den io_service eingereiht wird. Nur einer Ihrer Threads wird es aus der Warteschlange nehmen und ausführen.

Achten Sie darauf, async_read() nicht mehr als einmal auf einmal zu verwenden pro Socket.