您的位置:首页 > 运维架构 > Linux

Linux工作队列的使用

2010-08-12 10:28 393 查看
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)
释放创建的工作队列
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: