您的位置:首页 > 其它

延时工作队列INIT_DELAYED_WORK

2015-07-15 13:49 661 查看
如何使用queue_delayed_work函数
#include <linux/kernel.h>
  
#include <linux/module.h>   
#include <linux/proc_fs.h>   
#include <linux/workqueue.h>   
#include <linux/sched.h>   
#include <linux/init.h>   
#include <linux/interrupt.h>   
#include <linux/delay.h>   
  
struct workqueue_struct *test_wq;  
struct delayed_work test_dwq;  
  
void delay_func(struct work_struct *work);  
  
void delay_func(struct work_struct *work)  
{  
    int i;  
  
    printk(KERN_INFO "My name is delay_func!\n");  
    for (i = 0; i < 3; i++) {  
        printk(KERN_ERR "delay_fun:i=%d\n", i);  
        msleep(1000);  
    }  
}  
  
static int __init example_init(void)  
{  
    int i;  
    int ret;  
  
    test_wq = create_workqueue("test_wq");  
    if (!test_wq) {  
        printk(KERN_ERR "No memory for workqueue\n");  
        return 1;     
    }  
    printk(KERN_INFO "Create Workqueue successful!\n");  
  
    INIT_DELAYED_WORK(&test_dwq, delay_func);  
      
    ret = queue_delayed_work(test_wq, &test_dwq, 5000);  
    printk(KERN_INFO "first ret=%d!\n", ret);  
      
    for (i = 0; i < 3; i++) {   
        printk(KERN_INFO "Example:ret= %d,i=%d\n", ret, i);  
        msleep(100);  
    }  
  
    ret = queue_delayed_work(test_wq, &test_dwq, 0);  
    printk(KERN_INFO "second ret=%d!\n", ret);  
  
    return 0;  
}  
  
static void __exit example_exit(void)  
{  
    int ret;  
    ret = cancel_delayed_work(&test_dwq);  
    flush_workqueue(test_wq);  
    destroy_workqueue(test_wq);  
    printk(KERN_INFO "Goodbay! ret=%d\n", ret);  
}  
module_init(example_init);  
module_exit(example_exit);  
MODULE_LICENSE("GPL");  

运行结果:

kernel: Create Workqueue successful!  

kernel: first ret=1!  

kernel: Example:ret= 1,i=0  

kernel: Example:ret= 1,i=1  

kernel: Example:ret= 1,i=2  

kernel: second ret=0!  

kernel: Goodbay! ret=1  

kernel: Create Workqueue successful! 

说明将任务添加到工作队列后,如果工作队列还在执行该任务,则queue_delayed_work()返回1,否则返回0,如上实例所述;

主线程delay_wq将任务添加到工作队列后,使得工作队列在延迟delay后执行函数delay_func(),而delay_wq线程继续执行;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: