epoll有两个函数: epoll_ctl epoll_wait 如果我在同一个epoll_fd上使用它们,它们是否是线程安全的? 如果一个线程调用epoll_wait,其他线程同时调用epoll_ctl会发生什么?
它是线程安全的,但并没有太多明确说明这一点的文档。请参见此处 顺便说一下,您也可以有多个线程等待单个epoll_fd,但在这种情况下可能会变得有些棘手。(即您可能需要使用边缘触发的EPOLLET或oneshot模式的EPOLLONESHOT。请参见此处。)
注意: 已存在的接受的答案是正确的,但它提到了"没有太多明确说明的文档",而 epoll 文档却明确说明了这一点。 epoll_wait 的手册页明确允许在另一个线程中等待时将文件描述符添加到 epoll 集合中: 章节 "Notes": 当一个线程被阻塞在调用 epoll_wait() 时,另一个线程可以向正在等待的 epoll 实例中添加文件描述符。如果新的文件描述符准备就绪,它将导致 epoll_wait() 调用取消阻止。