我看到内核源代码中的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监视器,则存在此问题。