进程调度API之prepare_to_wait/prepare_to_wait_exclusive

本文详细介绍了Linux内核中的waitqueue机制,重点讲解了prepare_to_wait和prepare_to_wait_exclusive两个函数的功能及其实现细节,包括如何将waitqueue加入队列并设置进程状态。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

void  prepare_to_wait(wait_queue_head_t *q, wait_queue_t *wait, int state)用于将wait queue
加入到wait queue head 这个队列中,并设置当前thread的状态为state。与此具有有相同功能的函数是add_wait_queue。区别在于
调用prepare_to_wait 在将wait_queue_t *wait加入到wait_queue_head_t *q中时,会判断wait_queue_t *wait 中
是否包含要唤醒的进程.
void
prepare_to_wait(wait_queue_head_t *q, wait_queue_t *wait, int state)
{
	unsigned long flags;

	wait->flags &= ~WQ_FLAG_EXCLUSIVE;
	spin_lock_irqsave(&q->lock, flags);
//判断当前wait->task_list 为null,如果为null,说明没有进程需要唤醒,也就没有
//必要添加到wait_queue_head_t *q,
	if (list_empty(&wait->task_list))
		__add_wait_queue(q, wait);

	set_current_state(state);
	spin_unlock_irqrestore(&q->lock, flags);
}
这个函数会清除WQ_FLAG_EXCLUSIVE 。如果不需要清除WQ_FLAG_EXCLUSIVE的话,可以调用prepare_to_wait_exclusive
相比add_wait_queue,prepare_to_wait 多了一层判断wait->task_list 是否为null,应优先使用这个函数
void
prepare_to_wait_exclusive(wait_queue_head_t *q, wait_queue_t *wait, int state)
{
	unsigned long flags;

	wait->flags |= WQ_FLAG_EXCLUSIVE;
	spin_lock_irqsave(&q->lock, flags);
	if (list_empty(&wait->task_list))
		__add_wait_queue_tail(q, wait);
	set_current_state(state);
	spin_unlock_irqrestore(&q->lock, flags);
}
这个函数会置位WQ_FLAG_EXCLUSIVE,并将wait_queue_t *wait 添加到ait_queue_head_t *q的最后.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值