2015-11-18 8 views
5

Ich bin ziemlich neu in Asio Framework, also bitte sei nett. Ich habe mehr Boost Asio Beispiel untersucht und festgestellt, dass Menschen async wie diese verwenden Anruf:Boost: Ist es sicher, mehrere Rekursionen in asynchronen Aufrufen zu verwenden?

void read() 
{ 
    async_read(socket_, boost::asio::buffer(&user_[0], user_.size()), 
     boost::bind(&Connection::handle_user_read, this, 
     placeholders::error, placeholders::bytes_transferred)); 
} 
void handle_user_read(...) 
{ 
    ... 
    read(); 
    ... 
} 

Ich denke, dieser Code ist nicht sicher, da sie mehrere Rekursion verwendet. So kann es nicht verwendet werden, wenn viele Leseoperationen wegen Call-Stack-Überlauf durchgeführt werden. Ich bin nicht 100% sicher und kann keine ähnlichen Gedanken von anderen Menschen finden.

Könnte jemand bitte dies im Detail erklären?

Antwort

4

Ich nehme an, die Funktion read() fügt der E/A-Warteschlange nur eine neue asynchrone Leseanforderung hinzu und wird sofort beendet, sodass in diesem Code keine Rekursion stattfindet.

Ich meine, die read() ruft Connection :: handle_user_read nicht direkt. Es nur speichern der Funktionszeiger in der IO-Warteschlange. Diese Funktion wird asynchron durch externen Code aufgerufen, wenn ein neuer Datenblock verfügbar ist.

+0

Also: ja, es ist sicher. so machen sie das in der Boost-Dokumentation. – Unda

+0

Danke, daran habe ich nicht gedacht. Jetzt ist es vollkommen klar. –