【问题标题】:blocked requests in io_serviceio_service 中的阻塞请求
【发布时间】:2013-11-12 21:05:13
【问题描述】:

我已经使用 boost::asio 库实现了客户端服务器程序。 在我的实现中,有时 io_service.run() 会无限期地阻塞。如果我向 io_service 传递另一个请求,则被阻止的调用开始正常执行。

有什么方法可以查看 io_service 队列中的待处理请求是什么?

我没有使用工作对象来阻止运行调用!

【问题讨论】:

  • 我不知道。在不知道自己在做什么的情况下,很难找出是什么阻碍了你。你分叉了你的应用程序吗?您的任何处理程序都没有返回吗?没有取消deadline_timer?如果你找不到任何东西,你总是可以使用多个 io_service。也许每个插座一个,这样你就可以追捕有问题的电话。当您相信一切都已完成时,您也可以stop您的 io_service。或者您只需取消处理程序中的所有其他异步操作并在需要时重新启动它们。或者不要run,而是poll,这样你就可以控制什么时候发生。

标签: boost-asio


【解决方案1】:

没有官方方法可以查询io_service 来查找所有待处理的请求。但是,有一些技术可以调试问题:

  • Boost 1.47 引入了handler tracking。只需定义BOOST_ASIO_ENABLE_HANDLER_TRACKING,Boost.Asio 就会将调试输出(包括时间戳、标识符和操作类型)写入标准错误流。
  • 附加一个调试器挖掘层以查找和检查操作队列。这个answer 涵盖了理解处理程序跟踪和使用调试器检查epoll_reactor 的操作队列。

最后,如果您认为这是一个错误,那么可能值得更新到最新版本或查看revision history 以了解相关更改。无论如何,更详细地描述问题可能有助于其他人帮助确定问题的根源和潜在的解决方案。

【讨论】:

    【解决方案2】:

    现在我花了几个小时阅读和试验(我还需要更多 boost::asio 功能来工作),结果证明:有点。 但它并不像人们希望的那样简单易读。

    在引擎盖下(嗯,在最外面的引擎盖下)io_service 注册了一堆其他服务,它们完成各自领域所需的async_ 操作。 这些是参考中描述的“服务”。 现在可悲的是,无论是否有工作要做,服务都保持注册状态。例如,如果您的 io_service 有一个 udp 套接字,它仍然会拥有所有相应的服务,即使该套接字本身处于非活动状态。

    但是你可以询问你的 io_service 它有哪些服务。假设您想知道名为 m_io_service 的 io_service 是否具有 udp datagram_socket_service。然后你可以调用类似的东西:

    if (boost::asio::has_service<boost::asio::datagram_socket_service<boost::asio::ip::udp> >(m_io_service))
    {
        //Whatever
    }
    

    这并没有太大帮助,因为无论套接字是否处于活动状态,它都是正确的。但是在您知道您拥有该服务之后,您可以使用use_service 而不是has_service 来获取它的引用,但使用相同数量的。 现在您可以检查该服务以了解它在做什么。可悲的是,它不会告诉您出色的处理程序名称是什么(可能部分是因为它不知道它们)但是如果它是一个套接字,您可以获得它的implemention_type 并检查它当前是否为is_open 或找到任何一个local_endpointremote_endpoint

    如果是deadline_timer_service,您可以找出它何时出现expires_at

    有关服务是什么以及不愿意告诉您的更多信息,请参阅参考资料。 http://www.boost.org/doc/libs/1_54_0/doc/html/boost_asio/reference.html

    然后,希望此信息可以让您确定哪个async_ 操作没有返回。 如果没有,至少您可以cancel 任何意外活跃的服务。

    【讨论】:

      猜你喜欢
      • 2018-09-01
      • 1970-01-01
      • 2011-07-07
      • 2013-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-22
      相关资源
      最近更新 更多