了解函数queue_delayed_work()
/********************************************** * Author: lewiyon@hotmail.com * File name: delay_wq.c * Description: learn the function queue_delayed_work() * Date: 2011-12-24 *********************************************/ #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"); MODULE_AUTHOR("lewiyon <lewiyon@hotmail.com>");
运行结果:
Dec 24 20:50:40 RedHat kernel: Create Workqueue successful! Dec 24 20:50:40 RedHat kernel: first ret=1! Dec 24 20:50:40 RedHat kernel: Example:ret= 1,i=0 Dec 24 20:50:41 RedHat kernel: Example:ret= 1,i=1 Dec 24 20:50:41 RedHat kernel: Example:ret= 1,i=2 Dec 24 20:50:41 RedHat kernel: second ret=0! Dec 24 20:50:43 RedHat kernel: Goodbay! ret=1说明将任务添加到工作队列后,如果工作队列还在执行该任务,则queue_delayed_work()返回1,否则返回0,如上实例所述;
主线程delay_wq将任务添加到工作队列后,使得工作队列在延迟delay后执行函数delay_func(),而delay_wq线程继续执行;
posted on 2011-12-24 00:42 YoungerChina 阅读(1251) 评论(0) 编辑 收藏 举报
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人