【问题标题】:Boost ASIO: do we need to keep using async_read and write inside a function called from async_read?Boost ASIO:我们是否需要在从 async_read 调用的函数中继续使用 async_read 和 write?
【发布时间】:2013-04-16 12:04:16
【问题描述】:

我一直在尝试理解 boost 的 http server 3 example 中的逻辑。本例中的请求是在 connection.cpp 中的 start() 方法中读取的,该方法调用:

socket_.async_read_some(boost::asio::buffer(buffer_),
      strand_.wrap(
        boost::bind(&connection::handle_read, shared_from_this(),
          boost::asio::placeholders::error,
          boost::asio::placeholders::bytes_transferred)));

注意 async_read_some 方法是documented to return immediately。然后在读取处理程序 (connection::handle_read()) 中,如果 parse 返回 boost::indeterminate,我们可能会再次调用 async_read_some。鉴于我们已经知道我们在一个单独的线程中工作,这比socket_.read_some(buffer) 有什么好处。我问的原因是我想稍微更改消息解析以按需调用 read_some,但我想到的方法不适用于异步读取。

还有一个相关的问题:

async_read_some()

boost::thread th([](){ ret = read_some(); handle_read(ret) });?

【问题讨论】:

    标签: c++ boost boost-asio


    【解决方案1】:

    Boost.Asio 的HTTP Server 3 示例的编码方式与线程池的大小无关。因此,不能保证工作将在单独的线程中完成。然而,不可知论的好处是它可以通过更多的连接更好地扩展。例如,考虑检查同时连接的 10000 个客户端的C10K problem。对于 10000 个客户端,同步解决方案可能会遇到各种性能问题或资源限制。此外,异步特性有助于将程序与网络中的行为变化隔离开来。例如,考虑一个具有 3 个客户端和 2 个线程的同步程序,但由于网络上的噪声增加,其中 2 个客户端具有高延迟。如果两个线程都被阻塞以等待来自其他客户端的数据,则可能会无意中影响第三个客户端。

    如果连接数量有限且数量有限,并且每个连接都由一个线程提供服务,那么同步服务器和异步服务器之间的性能差异可能很小。如果可能,通常建议避免混合使用异步和同步编程,因为它可以将复杂的解决方案变成复杂的解决方案。此外,大多数同步算法都可以异步编写。

    异步操作和同步操作(即使是在专用线程中运行的操作)有两个主要区别:

    • 线程安全。如documentation中所述:

      一般来说,并发使用不同的对象是安全的,但并发使用单个对象是不安全的。

      因此,在同步操作正在进行时,无法安全地启动异步和同步操作,即使该操作是在其自己的线程中调用的。这在半双工协议中可能是最小的,但应该考虑使用全双工协议。

    • 能够取消操作。如this 回答中所述,同步操作无法通过Boost.Asio 提供的cancel() 成员函数取消。相反,应用程序可能需要使用较低级别的机制,例如信号。

    【讨论】:

    • 感谢您的描述 - 我没有做过很多套接字编程,所以这很有启发性。我对 HTTP Server 3 代码的唯一抱怨是,consume 过于冗长。服务器 4 稍微少一点,但似乎还是太多了。我试图写if (++_reader != 'H' || ++_reader != 'T' || ++_reader != 'T' || ++_reader != 'P' || ++_reader != '/') return false;,如果缓冲区中的数据用完,reader::operator++ 会调用read_some。不幸的是,异步操作似乎无法做到这一点。
    猜你喜欢
    • 2020-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-21
    • 1970-01-01
    • 1970-01-01
    • 2013-02-24
    相关资源
    最近更新 更多