惊群
4 分钟阅读
•
529 字
+
509 词
惊群:n个进程或者线程在等待某一个条件
如果是epoll_wait惊群现象呢
-
EPOLLONESHOT 标志
:
- 当使用EPOLLONESHOT标志注册一个文件描述符时,一旦该描述符上的事件被触发并通知给某个线程后,epoll会自动将其从监听集合中移除,直到你重新添加它。
- 这确保了每个事件只通知一个线程,避免了多个线程竞争同一个事件。
c复制epoll_ctl(epfd, EPOLL_CTL_ADD, fd, &ev); ev.events = EPOLLIN | EPOLLONESHOT; -
==
EPOLLEXCLUSIVE 标志
==(Linux 4.5+):
- 这是专门为解决惊群问题设计的标志。
- 使用该标志注册的描述符,当事件发生时,内核会尝试只唤醒一个等待的线程。
c复制ev.events = EPOLLIN | EPOLLEXCLUSIVE; epoll_ctl(epfd, EPOLL_CTL_ADD, fd, &ev); -
实现工作池设计
:
- 使用单独的线程来监听epoll事件,然后将就绪的事件分发给工作线程池中的线程处理。
- 这种方式只有一个线程被epoll_wait唤醒,然后它负责分配工作。
-
每个线程使用独立的epoll实例
:
- 每个线程创建和使用自己的epoll实例,并且监控不同的文件描述符集合。
- 这完全避免了共享epoll实例带来的惊群问题。