本文共 1335 字,大约阅读时间需要 4 分钟。
Linux工作队列是一种把工作推后执行的机制。推后的工作交由一个内核线程去执行,因此工作队列的优势就在于它允许重新调度甚至睡眠。使用工作队列的流程:主要有两种,一种使用内核缺省的队列,一种是我们自己创建一个工作队列。对于默认缺省的工作队列,如果工作队列负载太重,执行效率会很低。下面是自己创建的工作队列的使用流程。1.创建一个工作队列:struct workqueue_struct *create_workqueue(const char *name)如果单线程既可以满足要求,最好使用如下函数创建:struct workqueue_struct *create_singlethread_workqueue(const char *name)创建新的工作队列和相应的工作者线程,name用于该内核线程的命名。例如:struct workqueue_struct wq = create_singlethread_workqueue("wq");2.初始化:INIT_WORK(_work, _func, _data)目的是把用户指定的函数_func及_func需要的参数_data赋给work_struct的work中的func及data变量。work_struct结构体如下。
程序代码 /*2.6.32.2,include/linux/workqueue.h*/struct work_struct { atomic_long_t data;#define WORK_STRUCT_PENDING 0 /* T if work item pending execution */#define WORK_STRUCT_STATIC 1 /* static initializer (debugobjects) */#define WORK_STRUCT_FLAG_MASK (3UL)#define WORK_STRUCT_WQ_DATA_MASK (~WORK_STRUCT_FLAG_MASK) struct list_head entry; work_func_t func;#ifdef CONFIG_LOCKDEP struct lockdep_map lockdep_map;#endif}; 例如:INIT_WORK(struct work_struct *work,func);3.把工作提交给创建的队列:int queue_work(struct workqueue_struct *wq, struct work_struct *work)queue_work把给定工作提交给创建的工作队列wq。或,int queue_delayed_work(struct workqueue_struct *wq, struct work_struct *work, unsigned long delay)把给定工作提交给创建的工作队列wq,并延迟执行工作。4.结束时,释放队列:destroy_workqueue(struct workqueue_struct *wq)释放创建的工作队列