与signal相比,Timer事件的集成会直观和简单很多。
集成到事件主循环
因为系统的I/O机制像select
和epoll_wait
都允许程序制定一个超时时间:
//
int select(int nfds, fd_set *readfds, fd_set *writefds,
fd_set *exceptfds, struct timeval *timeout);
//
int epoll_wait(int epfd, struct epoll_event *events,
int maxevents, int timeout);
即使没有I/O事件的发生,也能保证系统调用在Timeout时间内返回。
那么根据所有timer事件的最小超时时间来设置系统I/O的timeout时间,当系统I/O返回时,再激活所有就绪的Timer事件就可以了。
在event_base_loop
事件循环中,我们很轻易就能找