我在asio框架中相当新,所以请善待。 我调查了几个boost 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();
...
}
我认为这段代码不安全,因为它使用了多次递归。 因此,当由于调用堆栈溢出而执行大量读取操作时,无法使用它。 我不是百分百肯定,也无法找到其他人的类似想法。
有人可以详细解释一下吗?
答案 0 :(得分:4)
我认为read()函数只是将新的异步读取请求添加到I / O队列并立即退出,因此此代码中没有递归。
我的意思是,read()不直接调用Connection :: handle_user_read。它只是存储 IO队列中的函数指针。当一些新的数据块可用时,外部代码将异步调用此函数。
答案 1 :(得分:0)
这不是递归,而是链接异步操作;注意线程问题: