[apue] epoll 的一些不为人所注意的特性
之前曾经使用 epoll 构建过一个轻量级的 tcp 服务框架: 一个工业级、跨平台、轻量级的 tcp 网络服务框架:gevent 在调试的过程中,发现一些 epoll 之前没怎么注意到的特性。 a) iocp 是完全线程安全的,即同时可以有多个线程等待在 iocp 的完成队列上; 而 epoll 不行,同时只能有一个线程执行 epoll_wait 操作,因此这里需要做一点处理, 网上有人使用 condition_variable + mutex 实现 leader-follower 线程模型,但我只用了一个 mutex 就实现了, 当有事件发生了,leader 线程在执行事件处理器之前 unlock 这个 mutex, 就可以允许等待在这个 mutex 上的其它线程中的一个进入 epoll_wait 从而担任新的 leader。 (不知道多加一个 cv 有什么用,有明白原理的提示一下哈) b) epoll 在加入、删除句柄时是可以跨线程的,而且这一操作是线程安全的。 之前一直以为 epoll 会像 select 一像,添加或删除一个句柄需要先通知 leader 从 epoll_wait 中醒来, 在重新 wait 之前通过 epoll_ctl 添加或删除对应的句柄。但是现在看完全可以在另一个线程中执行 epoll_ctl 操作 而不用担心多线程问题