【问题标题】:Boost::asio and nested/recursive service.run()/run_one() [duplicate]Boost::asio 和嵌套/递归 service.run()/run_one() [重复]
【发布时间】:2011-11-04 15:05:50
【问题描述】:

io_service.run_one() 的嵌套调用是否可能不是 boost::asio 的有效使用。

例如,我有一个处理程序,它在套接字上接收到某些内容后执行。 io_service 使用 io_service.run_one() 在另一个线程中运行。因此,在我看来,io_service 将在为接收处理程序提供服务后停止。

然后在接收处理程序中,我再次执行 io_service.run_one() 以便现在通过套接字发回一些东西。这意味着,存在 io_service.run_one() 方法的嵌套/递归调用。

这种行为并没有真正起作用。我的意思是有时 run_one() 方法中有一个块永远不会返回。我也找不到任何有关此特定案例的文档处理。

那么,是否允许递归/嵌套 io_service 执行,或者这不是一个好的行为?

附: io_service.reset() 在每次 run_one() 执行之前使用。

【问题讨论】:

    标签: c++ sockets boost asynchronous boost-asio


    【解决方案1】:

    据我所知,这既不是预期用途,也不是在 asio 中记录的,所以看起来一个安全的假设是:不,它是无效的。

    现在,它现在可能在某些或所有平台上有效。但这并不一定是个好主意。

    另外,如果您不打算在处理程序内部阻塞,调用run_one(),您可能需要考虑poll_one()

    不管怎样,这样做听起来肯定很可疑。大概您假设正在发送特定消息,以便您可以在它之后立即执行一些工作?我只能想到非常人为的例子,在这些例子中可以安全地假设两条消息在 asio 消息队列中是背靠背的。

    【讨论】:

    • 事实上,我也认为这不是使用 asio 的安全方式。我现在已将完整实现更改为基于状态(如自动机),并且不再遇到任何阻塞问题。似乎万一从处理程序调用 run_one() 方法有时可能会永远阻塞。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多