linux下多线程epoll的一个问题

发布于 2024-11-07 19:45:31 字数 187 浏览 0 评论 0原文

我有一个使用 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

诺曦 2024-11-14 19:45:31

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.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文