This question already has answers here:
Is calling asio io_service poll() or poll_one() in a nested or recursive fashion (ie. within a handler) valid?
(2个答案)
3年前关闭。
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()执行之前使用。
(2个答案)
3年前关闭。
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()执行之前使用。
最佳答案
据我所知,这既非预期用途,也未在asio中进行记录,因此似乎是一个安全的假设:不,这是无效的。
现在,它可能现在在某些或所有平台上都可以使用。但这并不一定使它成为一个好主意。
另外,如果您打算不阻塞处理程序内部,调用run_one()
,则可能需要考虑使用poll_one()
。
无论哪种方式,这样做绝对听起来都是可疑的。大概您假设正在发送特定的消息,以便您可以在消息之后立即进行一些工作?我只能想到非常人为的示例,在该示例中,可以安全地假设两个消息在asio消息队列中是背对背的。
关于c++ - Boost::asio和嵌套/递归service.run()/run_one(),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8011342/
10-13 06:30