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,这会使两者分别以不同的方式将请求映射到服务器文件上. 最基本的区别 ...
随机推荐
- 一张图看懂css的position里的relative和absolute的区别
position有以下属性:static.inherit.fixed.absolute.relative前三个好理解好区分:static:是默认状态,没有定位,元素出现在正常的流中(忽略 top, b ...
- 洛谷P1352 没有上司的舞会——树形DP
第一次自己写树形DP的题,发个博客纪念`- 题目来源:P1352 没有上司的舞会 题目描述 某大学有N个职员,编号为1~N.他们之间有从属关系,也就是说他们的关系就像一棵以校长为根的树,父结点就是子结 ...
- The Largest Clique UVA - 11324( 强连通分量 + dp最长路)
这题 我刚开始想的是 缩点后 求出入度和出度为0 的点 然后统计个数 用总个数 减去 然而 这样是不可以的 画个图就明白了... 如果 减去度为0的点 那么最后如果出现这样的情况是不可 ...
- 快速傅里叶变换FFT / NTT
目录 FFT 系数表示法 点值表示法 复数 DFT(离散傅里叶变换) 单位根的性质 FFT(快速傅里叶变换) IFFT(快速傅里叶逆变换) NTT 阶 原根 扩展知识 FFT 参考blog: 十分简明 ...
- mysql主从配置的过程
首先参考MySQL5.5官方手册 以下章节: 6.4节如何设置复制 13.6.1节 用于控制主服务器的SQL语句 13.6.2节 用于控制从服务器的SQL语句 6.8节 复制启动选项 6.5节 不同M ...
- 解题:ZJOI 2006 书架
题面 学习了如何在维护序列的平衡树上查找某个数:按初始的顺序定个权值,然后每次找那个权值的DFS序即可.具体实现就是不停往上跳,然后是父亲的右儿子就加上父亲的左儿子,剩下的就是继续熟悉无旋树堆 #in ...
- python基础----面向对象的程序设计(五个阶段、对小白的忠告、关于OOP常用术语)、类、对象
一.面向对象的软件开发有如下几个阶段 1.面向对象分析(object oriented analysis ,O ...
- Mysql外键设置中的CASCADE、NO ACTION、RESTRICT、SET NULL
转: Mysql外键设置中的CASCADE.NO ACTION.RESTRICT.SET NULL 2017年06月11日 10:03:13 雅静8 阅读数:5491 版权声明:本文为博主原创文章 ...
- PID控制算法的C语言实现十一 模糊算法简介
在PID控制算法的C语言实现九中,文章已经对模糊PID的实质做了一个简要说明.本来打算等到完成毕业设计,工作稳定了再着力完成剩下的部分.鉴于网友的要求和信任,抽出时间来,对模糊PID做一个较为详细的论 ...
- CDOJ--1550&&1731
原题链接:http://acm.uestc.edu.cn/problems.php?vol=15 分析:首先筛出sqrt(2^31-1)以内的素数,对于给定的区间[L,R],仍然用筛素数的思想把那些是 ...