queue_delayed_work和queue_work区别 (转http://blog.csdn.net/dosculler/article/details/7968101)
queue_delayed_work和queue_work
一、参考文献:
1)http://www.linuxidc.com/Linux/2011-08/41655.htm
queue_delayed_work的使用过程如下:
--> 定义workqueue: struct workqueue_struct *test_workqueue; // 定义在: kernel/workqueue.c
--> 定义workqueue要做的delayed工作:struct delayed_work test_delayed_work; // 定义在: include/linux/workqueue.h
--> 初始化workqueue:INIT_DELAYED_WORK(test_workqueue, test_delayed_work); // 定义在:include/linux/workqueue.h
--> 创建线程queue并加以名字:test_workqueue = create_singlethread_workqueue("name_of_this_queue");
--> 运行queue:queue_delayed_work(test_workqueue, test_delayed_work, delay_time); // 定义在:kernel/workqueue.c, 其中delay_time是延迟多少时间来运行queue。
注: 在delayed_work中一定要再次将delayed_workqueue加入queue中,即再次运行queue_delayed_work。否则,此queue只运行一次。
2)http://blog.csdn.net/zchill/article/details/7076561
一个INIT_WORK()对应queue_work、schedule_work(),一个INIT_DELAYED_WORK()对应queue_delayed_work、schedule_delayH
后者就是专门用于可以有延时的,而前者就是没有延时的
关于工作队列机制,咱们还会用到另外两个函数,它们是cancel_delayed_work(struct delayed_work *work)和flush_scheduled_work().其中
cancel_delayed_work()的意思不言自明,对一个延迟执行的工作来说,这个函数的作用是在这个工作还未执行的时候就把它给取消掉.而flush_scheduled_work()的作用,是为了防止有竞争条件的
(例:比如说它先想好了,下午3点执行队列里的第N个成员,可是您突然把第N-1个成员给取走了,那您说这是不是得出错?所以,为了防止您这种唯恐天下不乱的人做出冒天下之大不韪的事
3)http://blog.csdn.net/heanyu/article/details/6899679
内核队列、定时器、阻塞、休眠
API:
1) INIT_WORK(_work, _func)
初始化指定工作,目的是把用户指定的函数_func赋给work_struct的func。
2) int schedule_work(struct work_struct *work)------>> queue_work
对工作进行调度,即把给定工作的处理函数提交给缺省的工作队列和工作者线程。工作者线程本质上是一个普通的内核线程,在默认情况下,每个CPU均有一个类型为“events”的工作者线程,当调用schedule_work时,这个工作者线程会被唤醒去执行工作链表上的所有工作。
3) int schedule_delayed_work(struct work_struct *work, unsigned long delay) ---> queue_delayed_work --> queue_work
延迟执行工作,与schedule_work类似。
4) void flush_scheduled_work(void)
刷新缺省工作队列。此函数会一直等待,直到队列中的所有工作都被执行。
5) int cancel_delayed_work(struct work_struct *work)
flush_scheduled_work并不取消任何延迟执行的工作,因此,如果要取消延迟工作,应该调用cancel_delayed_work。
4)http://bbs.chinaunix.net/thread-1927165-1-1.html
相对于create_singlethread_workqueue, create_workqueue同样会分配一个wq的工作队列,但是不同之处在于,对于多CPU系统而言,对每一个CPU,都会为之
创建一个per-CPU的cwq结构,对应每一个cwq,都会生成一个新的worker_thread进程。但是当用queue_work向cwq上提交work节点时,是哪个CPU调用该函数,那么便向该CPU对应的cwq上的worklist上增加work节点。
二、简略程序:
1)queue_work
create_workqueue("goodix_wq");//加载ko时init或probe时初始化
INIT_WORK(&ts->work, goodix_ts_work_func);//初始化工作队列
queue_work(goodix_wq, &ts->work);//此处需要request_irq中断触发或者是timer定时器触发, 调度执行并不等于立刻执行。而是指示
//worker_thread在下次处理工作队列的时候执行该工作;
destroy_workqueue(goodix_wq);//卸载ko退出或remove时注销
2)queue_work
create_singlethread_workqueue("proximity");///加载ko时init或probe时初始化 //单线程,此处也可使用create_workqueue();如前文引文4)内容
INIT_DELAYED_WORK(&ip->work, rohm_proximity_work));//初始化工作队列
queue_delayed_work(data->work_queue, &data->work,msecs_to_jiffies(ms));//同前面queue_work区别在于:自带延时功能,即定时器功能
//调用此函数后,经过ms时间后就会自动进入工作队伍函数,此处为rohm_proximity_work()
cancel_rearming_delayed_workqueue(proximity_data.work_queue, &proximity_data.work);//以下两句停止该队列时使用,比如此处psensor在脸远离时通过
flush_workqueue(proximity_data.work_queue); //file_operations
的.release调用此两句 destroy_workqueue
destroy_workqueue(proximity_data.work_queue);//卸载ko退出或remove时注销
附:queue_work()和schedule_work(&vibe_work);前者比后者多了个work_queue参数,即后者无需创建create_workqueue()动作
queue_delayed_work和queue_work区别 (转http://blog.csdn.net/dosculler/article/details/7968101)的更多相关文章
- 数组中&a与&a[0]的区别 转载自http://blog.csdn.net/FX677588/article/details/74857473
在探讨这个问题之前,我们首先来看一道笔试题,如下: [摘自牛客网]下列代码的结果是:(正确答案是 C) main() { int a[5]={1,2,3,4,5}; int *ptr=(int *)( ...
- [转帖] select、poll、epoll之间的区别总结[整理] + 知乎大神解答 https://blog.csdn.net/qq546770908/article/details/53082870 不过图都裂了.
select.poll.epoll之间的区别总结[整理] + 知乎大神解答 2016年11月08日 15:37:15 阅读数:2569 http://www.cnblogs.com/Anker/p/3 ...
- 抽象类和接口有什么区别---https://blog.csdn.net/csdn_aiyang/article/details/71171886
https://blog.csdn.net/csdn_aiyang/article/details/71171886 概念] 抽象类.具体类是相对的,并非绝对的.抽象是一种概念性名词,具体是一种可 ...
- 转:Java面试题集(51-70) http://blog.csdn.net/jackfrued/article/details/17403101
Java面试题集(51-70) Java程序员面试题集(51-70) http://blog.csdn.net/jackfrued/article/details/17403101 摘要:这一部分主要 ...
- PL/SQL常用设置 可看引用位置更清晰直观 引自:http://blog.csdn.net/xiaoqforever/article/details/27695569
引自:http://blog.csdn.net/xiaoqforever/article/details/27695569 1,登录后默认自动选中My Objects 默认情况下,PLSQL Deve ...
- 反射给对象赋值遇到的问题——类型转换[转http://blog.csdn.net/xiaohan2826/article/details/8536074]
发布时间:2012-10-25 10:49浏览次数:225 给一个对象属性赋值可以通过PropertyInfo.SetValue()方式进行赋值,但要注意值的类型要与属性保持一致. 创建对象实例的 ...
- http://blog.csdn.net/zhanglvmeng/article/details/11928469
本系列主要结合<PHP和MYSQL WEB开发 第四版>,在阅读中提出自己认为比较重要的一些问题,以加深对知识的了解程度. 1.简短.中等以及冗长风格的表单变量 $name; //简短风格 ...
- https://blog.csdn.net/u011489043/article/details/68488459
转自https://blog.csdn.net/u011489043/article/details/68488459 String 字符串常量 StringBuffer 字符串变量(线程安全) ...
- Nginx 配置location root 转自https://blog.csdn.net/rofth/article/details/78581617
nginx指定文件路径有两种方式root和alias,root与alias主要区别在于nginx如何解释location后面的uri,这会使两者分别以不同的方式将请求映射到服务器文件上. 最基本的区别 ...
随机推荐
- c#对一个类的扩展
首先定义一个静态类,参数使用this约束并选择需要扩展的类,当然也可以 继续添加扩展是需要添加的参数 public static class StringExrprp { /// <summar ...
- 第112天:javascript中函数预解析和执行阶段
关于javascript中的函数: 1.预解析:把所有的函数定义提前,所有的变量声明提前,变量的赋值不提前 2.执行 :从上到下执行,但有例外(setTimeout,setInterval,aja ...
- 第102天:CSS3实现立方体旋转
CSS3实现立方体旋转 <!DOCTYPE html> <html lang="en"> <head> <meta charset=&qu ...
- es6中对象转数组,转map
//对象转数组let array = Object.keys(userPermission).map(key=> userPermission[key]) console.log(array) ...
- dom对象转成jquery对象时候 变成数组 jquery转成dom时候 取数组第一个
- collection 在创建迭代器后 不能在添加数据 否则会出现并发问题
collection 在创建迭代器后 不能在添加数据 否则会出现并发问题
- BZOJ4975 区间翻转
这个范围给的很像区间dp之类的,想了半天没一点思路,滚去看了一眼status被吓傻了.然后瞎猜了一发结论就过掉了. 求出逆序对数,判断是否为奇数即可.因为翻转区间会把将这段区间的逆序对取反,而长度为4 ...
- HDU.2149 Public Sale (博弈论 巴什博弈)
HDU.2149 Public Sale (博弈论 巴什博弈) 题意分析 巴什博奕裸题 博弈论快速入门 代码总览 #include <bits/stdc++.h> using namesp ...
- max os x lighttpd + php + mysql 部署
手贱,升级了max os x 到Yosemite,系统默认装了nginx,php,开机会自动启动!1 开机启动脚本默认在下面位置: /Library/LaunchDaemons/com.root.ng ...
- UESTC--1682
原题链接: 分析:求最小周期的应用. #include<cstdio> #include<cstring> #include<cmath> #include< ...