linux下多线程epoll的一个问题
我有一个使用 epoll(7) 的多线程 Linux 程序。 epoll(7) 手册页说,当其中一个 fd 关闭时,该 fd 将自动从 epoll 集中删除。我的问题是,如果 epoll 集的 fd 在一个线程中关闭,而 epoll 集在另一个线程中同时轮询而没有同步,会怎么样。程序会被损坏还是内核会自动同步此访问?
谢谢
冯
I have a multithread linux program which uses epoll(7). The epoll(7) man page says when one of its fds gets closed, this fd will be automatically removed from the epoll set. My question is what if a fd of the epoll set gets closed in one thread while the epoll set is being polled in another thread concurrently without synchronization. Will the program get corrupted or will the kernel synchronize this access automatically?
Thanks
Feng
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
epoll 集中的 fd 由内核维护,因此您是安全的 - 内核会处理任何必要的同步。
也就是说,在 fd 关闭之前,fd 上的事件仍然有可能进入另一个线程。因此,来自 fd 的事件可能不再出现在集合中。通过精心设计的程序,这不会造成问题。
The fds in an epoll set are maintained by the kernel, so you are safe - the kernel handles any necessary synchronization.
That said, there remains the possibility that an event on the fd comes in on the other thread just before the fd is closed. Thus it might be possible to have an event from an fd which no longer appears to be in the set. With a carefully designed program this shouldn't cause a problem.