我看到内核源代码中的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
....
}
那"排他性"是否只会唤醒一个等待项(用户空间中的进程或线程)?
但是当我写了一些测试代码时,我发现thundering herd problem仍然存在。
为什么不能解决?谢谢!
答案 0 :(得分:3)
在内核代码中,我们可以在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);
}
在__wake_up_common()
中唤醒静态空sched/wait.c
时,只会唤醒非独占的第一个任务和第一个独占的任务。
通常只有一个任务被唤醒。
答案 1 :(得分:1)
这取决于您是否使用相同的epfd。标志WQ_FLAG_EXCLUSIVE仅适用于等待相同eventpoll的TASK。
如果您的测试代码在同一个套接字上使用不同的epfd监视器,那么问题就存在。