提升:在异步调用中使用多次递归是否安全?

时间:2015-11-18 09:29:46

标签: c++ recursion boost-asio

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

我认为这段代码不安全,因为它使用了多次递归。 因此,当由于调用堆栈溢出而执行大量读取操作时,无法使用它。 我不是百分百肯定,也无法找到其他人的类似想法。

有人可以详细解释一下吗?

2 个答案:

答案 0 :(得分:4)

我认为read()函数只是将新的异步读取请求添加到I / O队列并立即退出,因此此代码中没有递归。

我的意思是,read()不直接调用Connection :: handle_user_read。它只是存储 IO队列中的函数指针。当一些新的数据块可用时,外部代码将异步调用此函数。

答案 1 :(得分:0)

这不是递归,而是链接异步操作;注意线程问题:

Why do I need strand per connection when using boost::asio?