文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>linux工作队列的使用...

linux工作队列的使用...

时间:2010-08-11  来源:sfrysh

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)
释放创建的工作队列

相关阅读 更多 +
排行榜 更多 +
幸运硬币官方正版下载

幸运硬币官方正版下载

休闲益智 下载
宝宝来找茬手机版 v9.86.00.00 安卓版

宝宝来找茬手机版 v9.86.00.00 安卓版

休闲益智 下载
翻滚飞机大战最新版 v1.0.4 安卓版

翻滚飞机大战最新版 v1.0.4 安卓版

飞行射击 下载