2011-01-16 8 views
28

Ich versuche derzeit boost :: asio für einige einfache TCP-Vernetzung zum ersten Mal zu verwenden, und ich Ich bin schon auf etwas gestoßen, mit dem ich nicht wirklich klar bin. Soweit ich weiß, ist die Methode io_service.run() im Grunde genommen eine Schleife, die so lange läuft, bis nichts mehr zu tun ist, was bedeutet, dass sie so lange läuft, bis ich mein kleines Serverobjekt loslasse. Da ich bereits eine Art von Mainloop eingerichtet habe, möchte ich die Netzwerkschleife lieber manuell von dort aktualisieren, nur um der Einfachheit willen, und ich denke, io_service.poll() würde tun, was ich will, etwa so:Boost :: Asio: io_service.run() vs Umfrage() oder wie integriere ich boost :: asio in Mainloop

Dies scheint zu funktionieren, aber ich frage mich immer noch, ob es einen Nachteil von dieser Methode gibt, da dies nicht der übliche Weg zu sein scheint, sich mit boost :: asios io services zu befassen. Ist das ein gültiger Ansatz oder sollte ich lieber io_service.run() in einem nicht blockierenden Extra-Thread verwenden?

Antwort

37

Die Verwendung von io_service::poll anstelle von io_service::run ist absolut akzeptabel. Der Unterschied erklärt sich in der documentation

Die poll() Funktion kann auch verwendet werden bereit Handler zu versenden, aber , ohne zu blockieren.

Beachten Sie, dass io_service::run blockiert, wenn es in der Warteschlange jede work links ist

Die Arbeitsklasse verwendet wird, um die io_service, wenn die Arbeit beginnt und endet zu informieren. Dadurch wird sichergestellt, dass die run() - Funktion io_service -Objekt nicht während der laufenden Arbeit beendet wird und dass sie beendet wird, wenn keine unfertige Arbeit übrig ist.

während io_service::poll zeigt dieses Verhalten nicht, es ruft nur Ready Handler. Beachten Sie außerdem, dass Sie bei jedem nachfolgenden Aufruf io_service::reset auf io_service:run oder io_service::poll aufrufen müssen.

+9

'io_service' wird nicht unbedingt gestoppt, nachdem' io_service :: poll' zurückgegeben wurde. Warum brauche ich 'io_service :: reset' vor dem folgenden' io_service :: run' oder 'io_service: poll'? – updogliu

2

Ein Nachteil ist, dass Sie eine Arbeitsschleife machen.

while(true) { 
    myIoService.poll() 
} 

wird zu 100% CPU. myIoService.run() wird 0% CPU verwenden.

myIoService.run_one() könnte tun, was Sie wollen, aber es wird blockiert, wenn es nichts zu tun gibt.

+2

würden Sie tatsächlich in diesem vereinfachten Fall bevorzugen, aber in der Situation, in der eine Ereignisschleife bereits besteht (sagen Sie, es macht Hintergrund-Rendering oder andere Dinge in Ersatzzyklen), dann wäre eine Umfrage bevorzugt, da Sie nicht wollen, dass das Spiel zum Stillstand kommt Jedes mal run() blockiert. –