【微代码】Linux异步执行机制work基本用法?

背景

Linux内核提供诸多异步执行机制,work就是其中一种。work的提供避免了启动多个内核线程造成资源占用等问题。内核提供一个专门的work来进行处理。本文主要记录work的基本用法

基本代码和用法

#include "linux/workqueue.h"

struct work_struct	work;

//初始化workhandler
INIT_WORK(&work, work_handler);

//定义workhandler
void work_handler(struct work_struct *work)
{
	//通过container_of,根据work地址获取private地址,然后获取数据,下文以linux 5.10中 mlnx5的cmd.c中为例
	//struct mlx5_cmd_work_ent *ent = container_of(work, struct mlx5_cmd_work_ent, work);
	//... 然后进行相关处理
}


//启动workqueue用来调度work的。
wq = create_singlethread_workqueue("my work queue");

//将work加入workqueue
queue_work(wq, &work); //至此 work将会被调度到并进行执行work_handler的代码。

其他

  • 另外创建work如何与“father”进行同步,其中complete就是一种同步机制,详细参考兄弟篇。
`INIT_WORK` 是 Linux 内核中的一个宏定义,用于初始化一个工作队列的 `work_struct` 结构。工作队列是内核中用于将工作延后执行的一种机制,它允许将函数推迟到一个安全的时间点执行,通常是在一个内核线程上下文中。 使用 `INIT_WORK` 的典型步骤如下: 1. 定义一个 `work_struct` 实例。 2. 使用 `INIT_WORK` 宏来初始化这个 `work_struct` 实例,同时关联要执行的函数和传递给该函数的数据。 3. 将工作队列的工作项(`work_struct`)添加到工作队列中。 下面是一个简单的例子,展示如何使用 `INIT_WORK`: ```c #include <linux/workqueue.h> #include <linux/module.h> // 这是我们要执行的函数 void my_work_function(struct work_struct *work) { // 这里执行实际的工作 printk(KERN_INFO "Work function executed!\n"); } // 初始化模块时执行的函数 static int __init my_init(void) { struct work_struct my_work; // 初始化 work_struct INIT_WORK(&my_work, my_work_function, NULL); // 将 my_work 添加到默认的工作队列 schedule_work(&my_work); return 0; } // 清理模块时执行的函数 static void __exit my_exit(void) { // 取消工作队列中的工作(如果还没被执行) cancel_work_sync(&my_work); } module_init(my_init); module_exit(my_exit); ``` 在上面的代码中,我们定义了一个工作队列函数 `my_work_function` 和模块初始化函数 `my_init`。在初始化函数中,我们使用 `INIT_WORK` 初始化了一个 `work_struct` 并将其加入到系统默认的工作队列中。模块清理函数 `my_exit` 中使用了 `cancel_work_sync` 来取消尚未执行的工作。 使用 `INIT_WORK` 时需要考虑线程安全和并发控制,确保在并发环境下正确处理数据同步和状态维护。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值