C ++

我使用boost :: asio来做一些非常基本的UDP数据包收集。 io_service对象在工作线程中实例化,并且从该线程内调用io_service.run()。 我的问题是当我完成数据包收集时,io_service.run()返回。

我不清楚在停止我的工作线程时,可以从其他线程调用io_service的哪些方法。 我有一个对io_service对象的引用,并从另一个线程中进行此调用:

ios.dispatch( boost::bind( &udp_server::handle_kill, this ) );

在我的udp_server类中,该函数的处理函数从单个boost :: asio :: ip :: udp :: socket和一个boost :: asio :: deadline_timer对象中取消了待处理的工作。 两者都有待完成的异步工作。 那时我打电话给ios.stop():

void udp_server::handle_kill()
{
    m_socket.cancel();
    m_timer.cancel();
    m_ios.stop();
}

没有待处理的工作,我期望在这一点上,我对ios.run()的调用应该返回 - 但这不会发生。

那为什么它不回来? 最可能的解释是我不应该从另一个线程调用io_service :: dispatch()。 但是dispatch()方法似乎就是为了做到这一点 - 在io_service :: run()正在工作的线程中调用一个函数调用。它似乎就是这样做的。

所以这给我留下了一些相关的问题:

  • 我正确使用io_service :: dispatch()吗?
  • 如果所有任务都被取消,是否有任何理由说io_service :: run()不应该返回?
  • socket :: upd :: cancel()似乎不是关闭套接字并中止所有工作的正确方法。 什么是正确的方式?
  • asio对我来说表现得相当不错,但我需要更好地理解这个架构。

    更多数据

    socket :: udp :: cancel()显然是在Win32下的一个开放套接字上不受支持的操作 - 所以这个操作通过抛出一个异常失败 - 这实际上导致从io_service :: run()退出,但绝对不是所需的出口。

    socket :: udp :: close()似乎不会取消挂起的async_receive_from()任务,因此调用它而不是socket :: udp :: cancel()似乎将线程留在io_service :: run()内的某处。


    从另一个线程调用io_service::stop是安全的,这在文档中有很好的描述

    线程安全

    不同的对象 :安全。

    共享对象 :安全,除了在未完成的run(),run_one(),poll()或poll_one()调用导致未定义的行为时调用reset()。

    正如你对问题的评论所表明的那样,你真的需要把它归结为一个可重复的例子。

    链接地址: http://www.djcxy.com/p/62667.html

    上一篇: c++

    下一篇: GUI automation on linux