我有一个方法可以通过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---|
| | | |
答案 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)
);
}
}