bennyhuo / Bennyhuo

bennyhuo.vercel.app
9 stars 3 forks source link

渡劫 C++ 协程(6):基于协程的挂起实现无阻塞的 sleep | Benny Huo #107

Open bennyhuo opened 1 year ago

bennyhuo commented 1 year ago

https://www.bennyhuo.com/2022/03/20/cpp-coroutines-06-sleep/

如果你想要等待 100ms,你会怎么做?sleep_for(100ms) 吗?

waiting4love commented 10 months ago

目前能找到的写C++协程调度最好的教程,学习了,感谢! 我在想调度器是否也可以做成轮询的模式,向所有的协程查询是否可以恢复,Awaitor生成可查询接口注册到调度器中。这样延迟操作实现很简单,而且可以和UI调度一起工作于同一线程。

bennyhuo commented 10 months ago

轮询模式类似于 select 吗,这样需要让调度器知道所有正在运行的协程,维护一个协程句柄的清单。其实直接做成消息队列就行,协程异步逻辑处理完之后向调度器发送消息,调度器通过读消息队列来决定恢复执行哪个协程。有点儿像 epoll。

waiting4love commented 10 months ago

@bennyhuo 轮询模式类似于 select 吗,这样需要让调度器知道所有正在运行的协程,维护一个协程句柄的清单。其实直接做成消息队列就行,协程异步逻辑处理完之后向调度器发送消息,调度器通过读消息队列来决定恢复执行哪个协程。有点儿像 epoll。

差不多类似select(但不阻塞)。因为我遇到的不少异步操作是不支持回调的,而是通过修改标记来得知是否完成。一个方法是建一个线程负责检测异步完成,然后由这个线程通知调度器“恢复协程”。我在想是否可以省掉这个线程,把原调度器里while循环体单独提取出来,假设命名为dispatch(),这里查询所有记录的协程(且包含一个查询functor),如果查询后得知完成,则恢复之。这个dispatch()可以放到UI空闲事件中做检测,也可以用一个线程循环检测(但要考虑交出CPU时间)。只是一个想法,准备实施看看。

bennyhuo commented 10 months ago

应该是可以的

waiting4love commented 10 months ago

@bennyhuo 应该是可以的

嗯,可行,初步实现了一个:https://github.com/waiting4love/MyCoroLib。多谢指导