我可以找到很多关于的例子wait_queue_head
.它可以作为一个信号,创建一个wait_queue_head
,有人可以使用它睡觉,直到其他人开始它.
但我无法找到一个使用wait_queue
自身的好例子,据说与它非常相关.
有人可以举例,还是在他们的引擎盖下?
Mik*_*Del 12
的
wait_queue_head_t
类型是一个相当简单的结构,在限定<linux/wait.h>
.它只包含一个锁变量和一个睡眠进程的链表.列表中的各个数据项是类型wait_queue_t
,列表是在其中定义的通用列表<linux/list.h>
.通常,
wait_queue_t
结构通过类似的功能分配在堆栈上interruptible_sleep_on
; 结构最终在堆栈中,因为它们在相关函数中被简单地声明为自动变量.一般来说,程序员不需要处理它们.
看看更深入的等待队列部分.
但是,某些高级应用程序可能需要直接处理wait_queue_t变量.对于这些,值得快速查看一下像intermediatetible_sleep_on这样的函数内部实际发生了什么.以下是使用interruptible_sleep_on实现的简化版本,以使进程进入休眠状态:
Run Code Online (Sandbox Code Playgroud)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变量(等待,在堆栈上分配)并初始化它.任务的状态设置为TASK_INTERRUPTIBLE,这意味着它处于可中断的睡眠状态.然后将等待队列条目添加到队列(wait_queue_head_t*参数).然后调用schedule,将处理器放弃给其他人.schedule仅在其他人唤醒进程并将其状态设置为TASK_RUNNING时返回.此时,等待队列条目将从队列中删除,并完成睡眠
等待队列中涉及的数据结构的内部:
更新:对于认为图像是我自己的用户 - 这是再一次链接到Linux设备驱动程序的图像来自
归档时间: |
|
查看次数: |
6634 次 |
最近记录: |