• 如何使用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 ",__FUNCTION__,__LINE__);  
        for (i = 0; i < 3; i++) {  
            printk(KERN_ERR "%s:i=%d ",__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! ");  
            return 1;     
        }  
        printk(KERN_INFO "Create workqueue successful! ");  
      
        INIT_DELAYED_WORK(&mdwq, delay_work_func);  
          
        ret = queue_delayed_work(mwq, &mdwq, 3000);  
        printk(KERN_INFO "first ret=%d! ", ret);  
          
        for (i = 0; i < 3; i++) {   
            printk(KERN_INFO "%s:ret=%d,i=%d ",__FUNCTION__,ret, i);  
            msleep(1000);  
        }  
      
        ret = queue_delayed_work(mwq, &mdwq, 0);  
        printk(KERN_INFO "second ret=%d! ", 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 ", 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函数,谢谢。
  • 相关阅读:
    躺着的人
    (转载)CentOS查看系统信息|CentOS查看命令
    (转载)重新介绍 JavaScript(JS 教程)
    (转载)Java 容器 & 泛型:四、Colletions.sort 和 Arrays.sort 的算法
    (转载)Java 容器 & 泛型:三、HashSet,TreeSet 和 LinkedHashSet比较
    (转载)Java 容器 & 泛型:二、ArrayList 、LinkedList和Vector比较
    (转载)Java 容器 & 泛型:一、认识容器
    (转载)Python IDLE reload(sys)后无法正常执行命令的原因
    jmete 取配置文件的行数(二)
    jmete 取配置文件的行数(一)
  • 原文地址:https://www.cnblogs.com/zafu/p/7400579.html
Copyright © 2020-2023  润新知