2015-11-18 10 views
5

私はかなり新しいasioフレームワークですので、親切にしてください。 私はいくつかのブーストASIO例を調査し、人々はこのように呼んで非同期使用することを発見しました:ブースト:非同期呼び出しで複数の再帰を使用するのは安全ですか?

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(); 
    ... 
} 

私はそれは、複数の再帰を使用しているため、このコードは安全ではないと思います。 これは、コールスタックのオーバーフローのために多くの読み取り操作が実行された場合に使用できません。 私はこれについて100%確信しておらず、他の人と同様の考えを見つけることができません。

誰でも詳細に説明できますか?

答えて

4

read()関数は単にI/Oキューに新しい非同期読み取り要求を追加してただちに終了するので、このコードに再帰はありません。

つまり、read()はConnection :: handle_user_readを直接呼び出しません。 は、関数ポインタをIOキューの中に格納します。この関数は、新しいデータチャンクが利用可能になると、外部コードによって非同期的に呼び出されます。

+0

So:はい、それは安全です。これは、ブーストのドキュメントでそれを行う方法です。 – Unda

+0

ありがとう、私はそれについて考えなかった。今は完全にクリアです。 –