![](/img/trans.png)
[英]Using wait_event_interruptible and wake_up_all together
[英]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.