首页 > 其他 > 详细

等待队列_睡眠和唤醒

时间:2016-10-11 14:12:50      阅读:232      评论:0      收藏:0      [点我收藏+]

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)

 

等待队列_睡眠和唤醒

原文:http://www.cnblogs.com/hei-da-mi/p/5948912.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!