工作队列接口
工作队列接口是在2.5的开发过程中引入的,用于取代任务队列接口(用于调度内核任务)。每个工作队列有一个专门的线程,所有来自运行队列的任 务在进程的上下文中运行(这样它们可以休眠)。驱动程序可以创建并使用它们自己的工作队列,或者使用内核的一个工作队列。工作队列用以下方式创建: struct workqueue_struct *create_workqueue(const char *name); 工作队列任务可以在编译时或者运行时创建。任务需要封装为一个叫做 work_struct 的结构体。在编译期初始化一个工作队列任务时要用到: DECLARE_WORK(name, void (*function)(void *), void *data); 在运行期初始化一个工作队列时要用到: INIT_WORK(struct work_struct *work, void (*function)(void *), void *data); int queue_work(struct workqueue_struct *queue, struct work_struct *work); 在queue_delay_work()中指定 delay,是为了保证至少在经过一段给定的最小延迟时间以后,工作队列中的任务才可以真正执行。 工作队列中的任务由相关的工作线程执行,可能是在一个无法预期的时间(取决于负载,中断等等),或者是在一段延迟以后。任何一个在工作队列中等待了无限长的时间也没有运行的任务可以用下面的方法取消: int cancel_delayed_work(struct work_struct *work); void flush_workqueue(struct workqueue_struct *queue); void destroy_workqueue(struct workqueue_struct *queue); 需要特别注意的是缺省队列对所有驱动程序来说都是可用的,但是只有经过GP许可的驱动程序可以用自定义的工作队列: int schedule_work(struct work_struct *work); -- 向工作队列中添加一个任务 当模块被缷载时应该去调用一个 flash_scheduled_work() 函数,这个函数会使等待队列中所有的任务都被执行。 |