epoll是否线程安全?

38

epoll有两个函数:

  1. epoll_ctl
  2. epoll_wait

如果我在同一个epoll_fd上使用它们,它们是否是线程安全的
如果一个线程调用epoll_wait,其他线程同时调用epoll_ctl会发生什么?


1
你使用相同的 epoll_fd 吗? - Karoly Horvath
是的,我使用相同的 epoll_fd。 - atomd
你能提供更多关于你使用的细节吗?为什么必须使用相同的 epoll fd?如果你正在进行 RX/TX 结构,你可以有一个 epoll fd 对应 IN 事件,另一个对应 OUT 事件(这是我在一些应用程序中使用的方法)。 - Foo Bah
嗨,我使用epll io多路复用和线程池,并且我想使用epoll_ctl来改变其他线程上的事件。但我不知道是否需要使用一些同步机制来确保线程安全。 - atomd
2个回答

26

它是线程安全的,但并没有太多明确说明这一点的文档。请参见此处

顺便说一下,您也可以有多个线程等待单个epoll_fd,但在这种情况下可能会变得有些棘手。(即您可能需要使用边缘触发的EPOLLET或oneshot模式的EPOLLONESHOT。请参见此处。)


5

注意: 已存在的接受的答案是正确的,但它提到了"没有太多明确说明的文档",而 epoll 文档却明确说明了这一点。

epoll_wait手册页明确允许在另一个线程中等待时将文件描述符添加到 epoll 集合中:

章节 "Notes":

当一个线程被阻塞在调用 epoll_wait() 时,另一个线程可以向正在等待的 epoll 实例中添加文件描述符。如果新的文件描述符准备就绪,它将导致 epoll_wait() 调用取消阻止。


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