【发布时间】:2014-10-14 03:44:54
【问题描述】:
我对 epoll 和边缘触发行为的理解是,当给定文件描述符发生状态更改时,您会收到通知。即,当数据在 fd 上可用时,您会收到通知,但只有在您耗尽所有数据(您会收到 EAGAIN)并且数据再次出现后才会再次收到通知。
基于这种理解,我实现了一个服务器,它执行以下操作:
- 监听客户端连接
- 对于每个连接,将 fd 添加到 epoll 中
- 当数据在 fd 上可用时,产生一个单独的线程来读取直到
EAGAIN - 重复直到数据读取完成
半伪代码:
n = epoll_wait(efd, events, MAXEVENTS, -1);
for (i = 0; i < n; ++i) {
check for errors;
if (server_sock == events[i].data.fd) {
conn = accept( ... );
make_nonblocking(conn);
event.data.fd = conn;
event.events = EPOLLIN | EPOLLRDHUP;
epoll_ctl(efd, EPOLL_CTL_ADD, conn, &event);
} else {
spawn_reader(events[i].data.fd);
}
使用上面的代码,我的期望是直到读者线程命中EAGAIN,epoll 不会为这个fd 生成另一个线程。情况似乎并非如此,我得到了许多线程。
我是否错误地使用了 epoll?每次生成阅读器线程时,我都不需要通过EPOLL_CTL_DEL 删除 fd,对吗?
【问题讨论】:
标签: multithreading epoll