曲径通幽论坛

 找回密码
 立即注册
搜索
查看: 4932|回复: 0
打印 上一主题 下一主题

等待队列结构体 | wait_queue_t

[复制链接]

4917

主题

5879

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34382
跳转到指定楼层
楼主
发表于 2011-3-4 10:20:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
内核:2.6.24


等待队列中的成员为下面的数据结构:
struct __wait_queue {
    unsigned int flags;
#define WQ_FLAG_EXCLUSIVE    0x01
    void *private;
    wait_queue_func_t func;
    struct list_head task_list;
};



flag 的值或者为 WQ_FLAG_EXCLUSIVE 或者为 0 。WQ_FLAG_EXCLUSIVE 相被独占地唤醒。
private 是一个指针,一般都用来指向等待进程的 task_struct 实例。
func 调用它来唤醒等待进程。
task_list 用作一个链表元素,在等待队列中,就靠它来进行连接。


为使当前进程在一个等待队列中睡眠,要使用 wait_event 配对函数,一般约定:
使用 wait_event() 睡眠,则用 wake_up() 来唤醒;
使用 wait_event_interruptible() 睡眠,则用 wake_up_interruptible() 来唤醒。


内核通常会在向块设备发出传输数据的请求后调用该函数。因为传输不会立即发生,而在此期间又无事可做,所以进程可以睡眠,睡眠后 CPU 会让给其他进程。在等到块设备的数据到达后,必须调用 wake_up() 或 wake_up_interruptible() 函数将睡眠的进程唤醒。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|曲径通幽 ( 琼ICP备11001422号-1|公安备案:46900502000207 )

GMT+8, 2024-5-16 17:00 , Processed in 0.063802 second(s), 22 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表