06 休眠唤醒
编程指南
需要定义一个等待队列(DECLARE_WAITQ_UEUE_HEAD)
将wait_event线程放入queue
1.休眠唤醒
1.1 休眠函数
文件路径include\linux\wait.h
函数 | 说明 |
---|---|
wait_event_interrupt(wq, condition) | 休眠一直到condition为真才退出 休眠期间可以被signal打断 |
wait_event(wq, condition) | 休眠一直到condition为真才退出 |
wait_event_interrupt_timeout(wq, condition, timeout) | 休眠一直到condition为真或者超时才退出 休眠期间可以被signal打断 |
wait_event_timeout(wq, condition, timeout) | 休眠一直到condition为真或者超时才退出 |
-
wq:等待队列。
休眠时将程序修改为非running状态,并将其放入wq队列。唤醒时从wq队列中唤醒
-
condition
唤醒event的的一个实现标志,为真表示唤醒休眠队列
1.2 唤醒函数
函数 | 说明 |
---|---|
wake_up_interruptible(x) | 唤醒x休眠队列中一个状态为TASK_INTERRUPTIBLE的线程 |
wake_up_interruptible_nr(x, nr) | 唤醒x休眠队列中nr个状态为TASK_INTERRUPTIBLE的线程 |
wake_up_interruptible(x) | 唤醒x队列中所有状态为TASK_INTERRUPTIBLE的线程 |
wake_up(x) | 唤醒x队列中的一个线程 |
wake_up_nr(x) | 唤醒x队列中的nr个线程 |
wake_up_nr_all(x) | 唤醒x队列中的所有线程 |
1.3 休眠与唤醒的关系
需要注意的是wait_event事件并不是调用wake_up后就能唤醒对应的事件。
wait_event事件的唤醒条件为已下条件共同触发
-
condition为真
-
wake_up事件触发
-
timeout(可选)