新Linux内核epoll中是否还有雷鸣群落问题?

我看到内核源代码中的fs/eventpoll.c是这样写的:

 static int ep_poll(struct eventpoll *ep, struct epoll_event __user *events, int maxevents, long timeout) { .... init_waitqueue_entry(&wait, current); __add_wait_queue_exclusive(&ep->wq, &wait); // *** NB .... } 

这个“独占”是否意味着只有一个等待项目(用户空间中的进程或线程)会被唤醒?

但是当我写了一些testing代码的时候,我发现雷鸣的问题依然存在。

为什么不能解决呢? 谢谢!

在内核代码中,我们可以在include/linux/wait.h看到__add_wait_queue_exclusive()将条目添加到列表的头部:

  __add_wait_queue_exclusive(wait_queue_head_t *q, wait_queue_t *wait) { wait->flags |= WQ_FLAG_EXCLUSIVE; __add_wait_queue(q, wait); } 

当在sched/wait.c中唤醒静态void __wake_up_common()sched/wait.c唤醒不是唯一的第一个任务,也是第一个独占任务。 所以通常只有一个任务被唤醒。

这取决于你是否使用相同的epfd。 标志WQ_FLAG_EXCLUSIVE仅适用于等待相同事件播放的任务。

如果您的测试代码在同一个套接字上使用不同的epfd监视器,则存在此问题。