boost :: asio :: io_service:在等待将来

时间:2016-10-07 07:23:00

标签: c++ boost boost-asio

我有一个方法可以通过IO服务从第三方调用。我的方法应该返回一个布尔值。但是,我需要将另一个任务发布到同一IO服务,并在我知道结果之前等待它完成。在等待其他任务完成时,如何将控制权返回到IO循环?

(我可以添加多个线程,但是可能会对我的方法进行多次调用,并且你仍然会遇到死锁)

之前调用图表:

<thread>    io_service               third_party    my_stuff
   |            |                        |             |
   |---run----->|                        |             |
   |            |-->some_posted_method-->|             |
   |            |                        |--callback-->|
   |            |                        |<--boolean---|
   |            |(next task)             |             |
   |            |                        |             |

首选呼叫图:

<thread>    io_service               third_party    my_stuff
   |            |                        |             |
   |---run----->|                        |             |
   |            |-->some_posted_method-->|             |
   |            |                        |--callback-->|
   |            |<----some_way_to_return_control-------|
   |            |(next task)             |             |
   |            |--------some_kind_of_resume---------->|
   |            |                        |<--boolean---|
   |            |                        |             |

2 个答案:

答案 0 :(得分:1)

“third_party”应异步调用“my_stuff”,指定一个处理程序,一旦结果准备就会继续,并将控制权返回给io_service。 “third_party”在这里有点担心,因为你可能无法修改它或者它不可取。

另一种方法是为“my_stuff”使用另一个io_service实例:“my_stuff”接口将是同步的,但实现将在相同或另一个线程中使用io_service来完成其任务。从来没有尝试过,但我没有看到任何有关Boost.Asio的信息。

答案 1 :(得分:0)

与提到的Tanner Sansbury一样,您可以从事件处理程序中调用poll_one,它将执行可用的处理程序。

请注意,您必须致电poll_one,因为如果继续添加新的处理程序,则poll无法保证返回。由于poll_one可能还没有准备好执行的处理程序,因此您可能需要添加睡眠以防止忙碌等待。我的代码最终是这样的:

while( !syncDone ) {
    boost::system::error_code  ec;

    int handlersExecuted = ioService.poll_one(ec);
    if( ec ) {
        //Not sure what error there could be, log it
    }

    if( 0 == handlersExecuted ) {
        std::this_thread::sleep_for(
            std::chrono::milliseconds(10)
        );
    }
}