我可以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
表示列表中的项目 – 在队列中等待的单个进程。