
配套的代码可以从本号的github下载: https:// github.com/shuningzhang /linux_kernel 内核相关电子书可以在这里下载: https:// u19702000.ctfile.com/di r/19702000-33344559-0b7371/
等待队列是一种基于资源状态的线程管理的机制,它可以使线程在资源不满足的情况下处于休眠状态,让出CPU资源,而资源状态满足时唤醒线程,使其继续进行业务的处理。 等待队列(wait queue)用于使线程等待某一特定的事件发生而无需频繁的轮询,进程在等待期间睡眠,在某件事发生时由内核自动唤醒。它是以双循环链表为基础数据结构,与进程的休眠唤醒机制紧密相联,是实现异步事件通知、跨进程通信、同步资源访问等技术的底层技术支撑。

基本接口
wait_queue_head_t 使用等待队列时,最基本的数据结构是struct wait_queue_head_t,也就是等待队列头,这个可以理解为等待队列的实体。队列头中包含一个双向链表,用于记录在该等待队列中处于等待状态的线程等信息。该结构体的定义如下:
struct __wait_queue_head {
spinlock_t lock; //用于互斥访问的自旋锁
struct list_head task_list;
};
typedef struct __wait_queue_head wait_queue_head_t;
可以通过宏定义 DECLARE_WAIT_QUEUE_HEAD
直接定义一个队列头变量,并完成初始化,该宏定义如下:
#define DECLARE_WAIT_QUEUE_HEAD(name)
struct wait_queue_head name = __WAIT_QUEUE_HEAD_INITIALIZER(name)
#define __WAIT_QUEUE_HEAD_INITIALIZER(name) {
.lock = __SPIN_LOCK_UNLOCKED(name.lock),
.head = { &(name).head, &(name).head } }
或者是通过结构体wait_queue_head_t定义后,调用函数init_waitqueue_head进行初始化。虽然方式不同,但基本原理是一样的,主要是对结构体内自旋锁和链表的初始化。
wait_event 函数wait_event用于在某个线程中调用,当调用该函数时,如果参数中的条件不满足,则该线程会进入休眠状态。下面代码是该函数的定义:
#define wait_event(wq, condition)
do {
if (condition)
break;
__wait_event(wq, condition);
} while (0)
#define __wait_event(wq, condition)
(void)___wait_event(wq, condition, TASK_UNI