Linux中多线程epoll的问题

7

我有一个使用epoll(7)的多线程Linux程序。 epoll(7)手册上说,当其fds之一关闭时,此fd将自动从epoll集合中删除。 我的问题是,如果在一个线程中关闭了epoll集合中的一个fd,而另一个线程正在不同步地同时轮询epoll集合,那么程序会被破坏还是内核会自动同步此访问?

谢谢

Feng

1个回答

7

epoll集合中的fds由内核维护,因此您是安全的 - 内核处理任何必要的同步。

尽管如此,仍然存在这样一种可能性:在关闭fd之前,另一个线程上的事件会到达fd。因此,可能会有来自不再出现在集合中的fd的事件。通过精心设计的程序,这不应该成为问题。


在我的Linux 2.6测试环境中,当一个管道的读取文件描述符正在被epoll_wait()监听时,关闭该文件描述符似乎会悄无声息地将其从轮询集合中移除。因此,在最坏的情况下,如果epoll_wait()是无限期的,并且关闭的文件描述符是唯一的文件描述符或唯一保证唤醒进程的文件描述符,则可能会永远挂起。 - pilcrow

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接