等待队列_睡眠和唤醒

1.定义并初始化一个等待队列头:
DECLARE_WAIT_QUEUE_HEAD(wait_que);

wait_queue_head_t wait_que;
init_waitqueue_head( &wait_que);

2.简单休眠:
wait_event(wait_que, condition)
wait_event_timeout(wait_que, condition, timeout)
wait_event_interruptible(wait_que, condition)
wait_event_interruptible_timeout(wait_que, condition, timeout)
...

还有好多wait系列的函数;
它们的实现主体架构一致:
DEFINE_WAIT(__wait);
prepare_to_wait(&wq, &__wait, TASK_KILLABLE);
schedule();
finish_wait(&wq, &__wait);
只是其中参数有些差异,处理过程略有不同

3.高级休眠(手动休眠):
方式一:
DEFINE_WAIT(my_wait);

wait_queue_t my_wait;
init_wait(&my_wait);

prepare_to_wait(&wait_que, &my_wait, state);
可以根据自己的需要,修改state;比如独占等待标志

schedule();
//或者是同族函数;例如schedule_timeout(ret);

finish_wait(&wait_que, &my_wait);


方式二:
DECLARE_WAITQUEUE(my_wait, tsk)

__add_wait_queue(&wait_que, &my_wait);
set_current_state(state);
raw_spin_unlock_irq(&lock);
schedule();
raw_spin_lock_irq(&lock);
set_current_state(state);
__remove_wait_queue(&wait_que, &my_wait);

其实其他的休眠方式的实现都与方式二类似;
只是给用户提供了更方便的接口;
提供更底层的接口是以防提供的方法不能满足用户需求。

4.唤醒
wake_up(wait_que)
wake_up_interruptible(wait_que)
wake_up_nr(wait_que, nr)
wake_up_interruptible_nr(wait_que, nr)
wake_up_all(wait_que)
wake_up_interruptible_all(wait_que)
wake_up_interruptible_sync(wait_que)

 

转载于:https://www.cnblogs.com/hei-da-mi/p/5948912.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值