0

在阅读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);


区别在于 __add_wait_queue() 和 __add_wait_queue_tail()。
为什么这一步的实现有所不同?

4

1 回答 1

1

在独占的情况下,只有第一个进程会被唤醒,所以它必须是等待时间最长的那个。

在非排他性中,所有进程都将被唤醒,因此顺序无关紧要,对于单链表,插入到头部更容易。

于 2013-05-27T07:45:08.527 回答