zoukankan      html  css  js  c++  java
  • 如何使用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函数,谢谢。
  • 相关阅读:
    设计模式(Design Pattern)扫盲
    SharePoint 2007 采用表单验证 (1) 失败:(
    发布一款给图片批量加水印的程序PicNet V1.0
    转篇文章,VS2005开发的dll如何安装进GAC
    cnblogs排名进入1500,纪念一下
    转载一篇提高baidu/google收录的文章
    关于.NET(C#)中字符型(Char)与数字类型的转换, CLR via c# 读书笔记
    《天风文章》V1.2.0 新闻/文章类asp.net2.0站点系统源码 (100%开源)
    推荐个.Net的论坛系统 Discuz!NT
    C#实现对图片加水印的一段代码.
  • 原文地址:https://www.cnblogs.com/zafu/p/7400579.html
Copyright © 2011-2022 走看看