linux内核中wait_queue_head和wait_queue的区别

我可以find很多关于wait_queue_head例子。 它作为一个信号,创build一个wait_queue_head ,有人可以使用它,直到其他人踢它。

但是我找不到使用wait_queue本身的一个很好的例子,据说与它有很大关系。

有人可以举个例子,或者在他们的引擎下?

从Linux设备驱动程序 :

wait_queue_head_t类型是一个相当简单的结构,在<linux/wait.h>定义。 它只包含一个锁变量和一个睡眠进程的链表。 列表中的各个数据项的类型是wait_queue_t ,列表是<linux/list.h>中定义的通用列表。

通常wait_queue_t结构是通过函数interruptible_sleep_on在堆栈上分配的; 结构最终在堆栈中,因为它们只是在相关函数中声明为自动变量。 一般来说,程序员不需要处理它们。

看看深入了解等待队列的一部分。

但是,某些高级应用程序可能需要直接处理wait_queue_t变量。 对于这些,值得快速浏览interruptible_sleep_on之类的函数。 下面是interruptible_sleep_on的一个简化版本来实现一个进程进入休眠状态:

  void simplified_sleep_on(wait_queue_head_t *queue) { wait_queue_t wait; init_waitqueue_entry(&wait, current); current->state = TASK_INTERRUPTIBLE; add_wait_queue(queue, &wait); schedule(); remove_wait_queue (queue, &wait); } 

这里的代码创建了一个新的wait_queue_t变量(wait,它被分配到堆栈上)并初始化它。 任务的状态设置为TASK_INTERRUPTIBLE,意味着它处于可中断的睡眠状态。 等待队列条目然后被添加到队列(wait_queue_head_t *参数)。 然后调度时间表,把处理器交给其他人。 只有当其他人唤醒进程并将其状态设置为TASK_RUNNING时,进度才会返回。 此时,等待队列条目将从队列中移除,并完成休眠

参与等待队列的数据结构的内部:

在这里输入图像描述

更新:对于那些认为图像是我自己的用户来说 – 这里又是一次链接到Linux设备驱动程序的图像取自

等待队列只是一个进程列表和一个锁。

wait_queue_head_t表示整个队列。 这是等候队列的头。

wait_queue_t表示列表中的项目 – 在队列中等待的单个进程。