博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Linux工作队列的使用
阅读量:4049 次
发布时间:2019-05-25

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

你可能感兴趣的文章
gdb debug tips
查看>>
arm linux 生成火焰图
查看>>
linux和windows内存布局验证
查看>>
linux insmod error -1 required key invalid
查看>>
linux kconfig配置
查看>>
linux不同模块completion通信
查看>>
linux printf获得时间戳
查看>>
C语言位扩展
查看>>
linux irqdebug
查看>>
git 常用命令
查看>>
linux位操作API
查看>>
uboot.lds文件分析
查看>>
uboot start.s文件分析
查看>>
没有路由器的情况下,开发板,虚拟机Ubuntu,win10主机,三者也可以ping通
查看>>
本地服务方式搭建etcd集群
查看>>
安装k8s Master高可用集群
查看>>
忽略图片透明区域的事件(Flex)
查看>>
忽略图片透明区域的事件(Flex)
查看>>
AS3 Flex基础知识100条
查看>>
Flex动态获取flash资源库文件
查看>>