延时工作队列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线程继续执行;
#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线程继续执行;
相关文章推荐
- MFC的多国语言界面的实现
- 前端开发相关---个人收藏网址地址大全
- Can't load IA 32-bit .dll on a AMD 64-bit platform
- 页面自动刷新
- UEFI HOB
- Amoeba for MySQL读写分离配置
- Android AIDL Service 跨进程传递复杂数据
- HDU 1561 树形DP入门
- 接口,抽象类的理解(转载)
- 不翻墙一样更新Android SDK(转,已亲身测试确认)
- UEFI Drivers & UEFI Driver Model
- C/C++程序设计02(基本概念,I/O流,C和C++的关系,混编)
- 理解A*寻路算法具体过程
- poj 1463 树形dp入门
- Android 常见知识整理(1)
- CONTAINING_RECORD IN EFI
- UEFI Images
- 使用VMWare+xp+windbg 配置
- minicom的学习
- mac os使用lsusb命令和连接未知的Android设备