簡體   English   中英

為什么要使用wake_up_all()而不是wake_up_interruptible()?

[英]Why use wake_up_all() and not wake_up_interruptible()?

我想了解為什么在下面的代碼中使用了wake_up_all(&lock->queue)宏,並且這個宏是wake_up_interruptible()是同一個宏嗎?

請指導我這方面,謝謝。

void ttm_read_unlock(struct ttm_lock *lock)
{
    spin_lock(&lock->lock);
    if (--lock->rw == 0)
        wake_up_all(&lock->queue);
    spin_unlock(&lock->lock);
}

static bool __ttm_read_lock(struct ttm_lock *lock)
{
    bool locked = false;

      spin_lock(&lock->lock);
      if (unlikely(lock->kill_takers)) 
    {
          send_sig(lock->signal, current, 0);
          spin_unlock(&lock->lock);
        return false;
       }
      if (lock->rw >= 0 && lock->flags == 0) 
    {
            ++lock->rw;
            locked = true;
      }
      spin_unlock(&lock->lock);
      return locked;
}

int ttm_read_lock(struct ttm_lock *lock, bool interruptible)
{
    int ret = 0;

      if (interruptible)
          ret = wait_event_interruptible(lock->queue,__ttm_read_lock(lock));
      else
            wait_event(lock->queue, __ttm_read_lock(lock));
      return ret;
}

當一個任務在Linux內核中等待等待時,它可以處於可中斷或不間斷的等待中。 前者將被信號喚醒而后者不會被喚醒。 等待類型在等待等待時由等待任務控制。

wake_up_all()函數將喚醒在給定等待隊列上等待的每個任務,這兩個任務都在等待中斷和不間斷。 此代碼使用wake_up_all()因為它支持針對此特定條件不間斷地等待的任務(請參閱ttm_read_lock() )。

wake_up_interruptible()函數只喚醒可中斷等待任務,所以將只使用,如果你不想吵醒不間斷等待任務。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM