常规非阻塞模型下的超时处理很直接,不是什么难题,
每个线程维护一个multimap, key是超时时间戳(当前时间+比如5秒),value指向控制块(或者你说的context),每次io之后更新控制块在multimap时间戳
另外起一个timerfd让epoll一起监视,每隔比如100ms timerfd返回,检查multimap,以当前时间戳取upper_bound,从begin开始到upper_bound挨个清理(也就是你说的夭折处理)
【 在 ylh0315 的大作中提到: 】
: 超时问题,同步比较简单,异步要在yield中处理,它的最后一个参数就是timeout。epoll对于单个fd的超时也没有什么好办法。
: 我的做法是每一步都在context中打时间戳。
: 记得主线程吗?它除了负责接生,另一个任务就是定期检查各个队列中超时的context。超时后会进行夭折处理。在IO中,yield也是进行TIMEOUT状态的返回,然后整个函数返回TIMEOUT状态。协程自行了断。
: ...................
--
FROM 113.120.108.*