协程调度可以由epoll进行,基于如下特性:
1.事件fd直接绑定context,事件响应直接提供context。减少了一个根据fd查找context的过程。
2.任何线程可以在任何时候把fd和context投入epoll,并且立即生效,不需要另外的激活操作。这条决定了任何线程在任何时候对任何context执行“挂起”。
3.任何线程都可以进行epoll_wait,它守候的是所有的事件,而不仅是自己投入的那个。这就决定了,当线程把context投入epoll后,就可以为所有的事件fd服务,为任何context执行resume。实现了线程和协程之间的任务切换。
BSD的Kqueue也具有这些功能,也可以作为协程调度器。这种设计恰恰不是自己造轮子,完全就是使用系统轮子。
使用过libaio,异步文件读写,任务提交后,线程还要等待任务完成。撒不开手,期间不能切换任务。解决方法是,配个eventfd,连同context,丢进epoll,让它协助调度协程。
select,也凑合可以调度协程。
任何线程都可以设置efds,但是要激活一下守候线程。只有唯一一个线程可以守候select。
事件激活后,要查找是哪一个context。然后把context丢进一个队列,队列的另一端是很多个线程在守候,之后的过程就与epoll一样了。
现在我担心的是,IOCP,是否具备协程调度功能。
【 在 hgoldfish 的大作中提到: 】
: 没这么简单哦。。你可以参考一下 libgo 和 cppcoro 啊。看看它们是怎么实现协程版本的 mutex, timer 等等的。
:
--
修改:ylh0315 FROM 221.218.61.*
FROM 221.218.61.*