Boost :: asio和嵌套/递归service.run()/ run_one()

时间:2011-11-04 15:05:51

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

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执行或者这不是一个好的行为?

P.S。 io_service.reset()用于每次run_one()执行。

1 个答案:

答案 0 :(得分:3)

据我所知,这既不是有用的,也不是asio中记载的,所以看起来安全的假设是:不,它无效。

现在,它可以在某些或所有平台上运行。但这并不一定会成为一个好主意。

此外,如果您打算不阻止处理程序,请致电run_one(),您可能需要考虑poll_one()

无论哪种方式,这样做肯定听起来很可疑。据推测,您假设正在调度特定消息,以便您可以立即执行某些工作吗?我只能想到非常人为的例子,假设两个消息在asio消息队列中背靠背,这是一个安全的假设。