如何使用queue_delayed_work函数

本文转自如何使用queue_delayed_work函数

1. delayed_workqueue主要用在需要延迟处理任务的驱动中,这些驱动的特性主要是不能使用中断。

delayed_workqueue的使用步骤如下:
   1) 定义workqueue要做的delayed工作:struct delayed_work mdelayed_work;
   2) 定义workqueue: struct workqueue_struct *mworkqueue; 
   3) 初始化workqueue:INIT_DELAYED_WORK(mworkqueue, mdelayed_work);
   4) 创建线程queue并加以名字:mworkqueue = create_singlethread_workqueue("myqueue");
   5) 运行queue:queue_delayed_work(mworkqueue, mdelayed_work, delay_time);
注:如果要实现循环实行任务,可以在在delayed_work中将delayed_workqueue再次添加到queue中,即在delayed_work中调用queue_delayed_work。

2.举例分析:

#include <linux/sched.h>
#include <linux/init.h>   
#include <linux/module.h> 
#include <linux/workqueue.h> 
#include <linux/proc_fs.h>
#include <linux/delay.h>   
#include <linux/interrupt.h>    
#include <linux/kernel.h> 
struct delayed_work mdwq;  
struct workqueue_struct *mwq;  
void delay_work_func(struct work_struct *work)  
{  
    int i;  
    printk(KERN_INFO "%s:%d\n",__FUNCTION__,__LINE__);  
    for (i = 0; i < 3; i++) {  
        printk(KERN_ERR "%s:i=%d\n",__FUNCTION__,i);  
        msleep(3000);  
    }  
}  
  
static int __init delay_work_init(void)  
{  
    int ret;  
    int i;  
    mwq = create_workqueue("my workqueue");  
    if (!mwq) {  
        printk(KERN_ERR "Create workqueue failed!\n");  
        return 1;     
    }  
    printk(KERN_INFO "Create workqueue successful!\n");  
  
    INIT_DELAYED_WORK(&mdwq, delay_work_func);  
      
    ret = queue_delayed_work(mwq, &mdwq, 3000);  
    printk(KERN_INFO "first ret=%d!\n", ret);  
      
    for (i = 0; i < 3; i++) {   
        printk(KERN_INFO "%s:ret=%d,i=%d\n",__FUNCTION__,ret, i);  
        msleep(1000);  
    }  
  
    ret = queue_delayed_work(mwq, &mdwq, 0);  
    printk(KERN_INFO "second ret=%d!\n", ret);  
  
    return 0;  
}  
  
static void __exit delay_work_exit(void)  
{  
    int ret;  
    ret = cancel_delayed_work(&mdwq);  
    flush_workqueue(mwq);  
    destroy_workqueue(mwq);  
    printk(KERN_INFO "Exit! ret=%d\n", ret);  
}  
module_init(delay_work_init);  
module_exit(delay_work_exit);  
MODULE_LICENSE("GPL");

运行结果:

kernel: Create workqueue successful!  
kernel: first ret=1!  
kernel: delay_work_init:ret=1,i=0  
kernel: delay_work_init:ret=1,i=1  
kernel: delay_work_init:ret=1,i=2  
kernel: second ret=0!  
kernel: Exit! ret=1

从例子可以看出当工作队列还在执行该任务,调用queue_delayed_work()返回1,否则返回0。
主线程mwq将任务添加到工作队列后,使得工作队列在延迟delay后执行函数delay_work_func(),而mwq线程继续执行;

转载请注明本文转自如何使用queue_delayed_work函数,谢谢。

时间: 2024-10-21 01:44:36

如何使用queue_delayed_work函数的相关文章

深入理解Linux内核day03--中断和异常

中断和异常 中断(interrupt)通常被定义为一个事件,该事件改编处理器执行的指令顺序.这样的事件与CPU芯片内部外部硬件电路产生电信号相对应. 中断通常分为同步中断(synchronous)中断和异步(asynchronous)中断: 同步中断是当指令执行时由CPU控制单元产生的,之所以称为同步,是因为只有在一条指令终止执行后CPU才会发出中断. 异步中断是由其他硬件设备依照CPU时钟信号随机产生的. 中断(异步中断)是由间隔定时器和I/O设备产生的,例如,用户的一次按键会引起一个中断.

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 --> 定义workqu

js高阶函数

map()方法定义在JavaScript的Array中,我们调用Array的map()方法,传入我们自己的函数,就得到了一个新的Array作为结果: function pow(x) { return x * x; } var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9]; arr.map(pow); // [1, 4, 9, 16, 25, 36, 49, 64, 81] reduce()把一个函数作用在这个Array的[x1, x2, x3...]上,这个函数必须接收两个

Django url 标签和reverse()函数的使用(转)

原文:http://www.yihaomen.com/article/python/355.htm 使用url标签和reverse()函数,可以避免在模板和view中对url进行硬编码,这样即使url改变了,对模板和view也没有影响 起初用django 开发应用的时候,完全是在urls.py 中硬编码配置地址,在views.py中HttpResponseRedirect()也是硬编码转向地址,当然在template 中也是一样了,这样带来一个问题,如果在urls.py 中修改了某个页面的地址,

Python2.7-内置函数

具体参见:https://docs.python.org/2/library/functions.html#file 1.进制转换:bin(x), oct(x), hex(x) 把一个十进制数分别转换为2.8.16进制 2.字符转换:chr(x)将数字(255以内不报错,128以后无字符)转换为对应ASCII字符, unichr(x)将数字转换为unicode, ord(x) 将字符转数字与前两个相反, unicode(obj, [encoding, [error]]) 用encoding解码o

linux Shell函数

Shell函数类似于Shell脚本,里面存放了一系列的指令,不过Shell的函数存在于内存,而不是硬盘文件,所以速度很快,另外,Shell还能对函数进行预处理,所以函数的启动比脚本更快. 1.函数定义 1 2 3 4 function 函数名() {     语句     [return] } 关键字function表示定义一个函数,可以省略,其后是函数名,有时函数名后可以跟一个括号,符号"{"表示函数执行命令的入口,该符号也可以在函数名那一行,"}"表示函数体的结

pythonの函数学习笔记(一)

函数是可以实现一些特定功能的小方法或小程序定义函数function的方法:def function_name(arg1,arg2[,...]): statement [return value]注意事项:1.def开头,代表定义函数,def和函数名中间要敲一个空格:2.返回值不是必须的,如果没有renturn语句,则默认返回值None:3.函数名必须以下划线或字母开头,可以包含任意字母.数字或下划线的组合,区分大小写且不能是保留字: py使用名称空间的概念存储对象,这个名称空间就是对象作用的区域

条件、循环、函数定义、字符串操作练习

注意标准库的两种导入与使用方式,建议大家采用<库名>.<函数名>的方式. 对前面的代码进行优化,用for,while,if,def实现: 用循环画五角星 1 import turtle 2 3 turtle.fillcolor("red") 4 turtle.begin_fill() 5 for i in range(5): 6 turtle.forward(100) 7 turtle.right(144) 8 turtle.end_fill() 用循环画同心圆

sql常用格式化函数及字符串函数

一.常用格式化函数 1.日期转字符串 select to_char(current_timestamp, 'YYYY-MM-DD HH24:MI:SS') //2017-09-18 22:41:50 YYYY:年(4和更多位) MM:月份号(01-12) DD:一个月里的日(01-31) HH24:一天的小时数(00-23) MI:分钟(00-59) SS:秒(00-59) 2.字符串转日期 select to_date('2017-09-18','YYYY-MM-DD') //2017-09-