在阅读linux源代码时,我已经阅读了以下代码:void fastcall add_wait_queue(wait_queue_head_t *q, wait_queue_t *wait){ unsigned long flags; wait->flags &= ~WQ_FLAG_EXCLUSIVE; spin_lock_irqsave(&q->lock, flags); __add_wait_queue(q, wait); spin_unlock_irqrestore(&q->lock, flags);}EXPORT_SYMBOL(add_wait_queue);void fastcall add_wait_queue_exclusive(wait_queue_head_t *q, wait_queue_t *wait){ unsigned long flags; wait->flags |= WQ_FLAG_EXCLUSIVE; spin_lock_irqsave(&q->lock, flags); __add_wait_queue_tail(q, wait); spin_unlock_irqrestore(&q->lock, flags);}EXPORT_SYMBOL(add_wait_queue_exclusive);
区别在于添加等待队列()和添加等待队列尾部()之间。
为什么在这个步骤中实现不同?
最佳答案
在独占情况下,只有第一个进程将被唤醒,因此它必须是等待时间最长的进程。
在非排他列表中,所有进程都将被唤醒,因此顺序无关紧要,对于单链接列表,插入到head更容易。
关于linux - 非排他等待队列添加过程同时排在排尾之后,为什么呢?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16768349/