boost::asio::io_service:在等待将来时将控制权返回到 IO 服务的运行
boost::asio::io_service: return control to IO service's run while waiting for future
我有一个通过第三方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---|
| | | |
"third_party"应该异步调用"my_stuff",指定一个处理程序,该处理程序将在结果准备好后立即继续,并将控制权返回给io_service
。"third_party"在这里有点令人担忧,因为你可能无法修改它,或者它不可取。
另一种方法是为"my_stuff"使用另一个io_service
实例:"my_stuff"接口将是同步的,但实现将在相同或另一个线程中使用io_service
来完成其任务。从来没有尝试过,但我没有看到任何问题,从我所知道的Boost.Asio。
就像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)
);
}
}
相关文章:
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- 什么时候在C++中返回常量引用是个好主意
- 你能重载对象变量名本身返回的内容吗
- 为什么 Serial.println(<char[]>);返回随机字符?
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- 如何获取std::result_of函数的返回类型
- QueryWorkingSet总是返回false
- (C++)分析树以计算返回错误值的简单算术表达式
- 访问者访问变体并返回不同类型时出错
- 如何返回一个类的两个对象相加的结果
- OpenInventor从9.8升级到10.4.2后,GLSL纹理返回零
- lower_bound()返回最后一个元素
- "throw expression code" 1e7 >返回 d 是什么?投掷标准::overflow_error( "too big" ) : d;意味 着?
- 奇怪的(对我来说)返回声明 - 在谷歌上找不到任何关于它的信息
- 如何取消对nullptr的屏蔽,返回正确的对象
- 奇怪的结构&GCC&clang(void*返回类型)
- 获取控制权到达非无效函数警告的末尾,尽管我在 th 函数中有返回语句
- 若控制权到达主体的末尾,那个么返回nullopt会破坏什么
- 线程问题:控制权没有返回给调用者
- C++ - 函数返回,但不交回控制权