Linux内核 -- 多线程之完成量completion的使用

Linux Kernel Completion 使用指南

在Linux内核编程中,completion是一个用于进程同步的机制,常用于等待某个事件的完成。它提供了一种简单的方式,让一个线程等待另一个线程完成某项任务。

基本使用方法

初始化

completion结构需要在使用之前进行初始化,可以使用以下两种方式之一:

  1. 静态初始化:
DECLARE_COMPLETION(my_completion);
  1. 动态初始化:
struct completion my_completion;
init_completion(&my_completion);

等待事件

一个线程可以调用wait_for_completion或其变种来等待事件的完成:

wait_for_completion(&my_completion);

变种方法包括:

  • wait_for_completion_timeout(&my_completion, timeout):带超时的等待。
  • wait_for_completion_interruptible(&my_completion):可以被中断的等待。
  • wait_for_completion_killable(&my_completion):可以被kill信号中断的等待。

触发事件

当某个事件完成时,应该调用complete函数来唤醒等待的线程:

complete(&my_completion);

如果有多个等待者,并且你希望唤醒所有等待者,可以使用complete_all

complete_all(&my_completion);

高级使用方法

重新初始化

在某些情况下,一个completion结构可能需要重复使用,这时可以使用reinit_completion重新初始化:

reinit_completion(&my_completion);

超时等待

为了避免无限期等待,可以使用带超时的等待函数,例如:

unsigned long timeout = msecs_to_jiffies(500); // 500 ms
wait_for_completion_timeout(&my_completion, timeout);

可中断的等待

有时需要等待可以被中断,可以使用wait_for_completion_interruptiblewait_for_completion_killable

int ret;
ret = wait_for_completion_interruptible(&my_completion);
if (ret == -ERESTARTSYS) {// 等待被信号中断
}

注意事项

  1. 初始化问题:确保在使用completion之前正确初始化,避免使用未初始化的completion。
  2. 重入问题:避免对同一个completion结构多次调用complete,因为这会导致不可预测的行为。
  3. 超时处理:合理使用超时等待,避免线程无限期挂起。
  4. 中断安全:在中断上下文中不能使用可能导致睡眠的函数,例如等待函数。
  5. 资源释放:在模块卸载或资源释放时,确保没有线程在等待,避免资源泄漏或访问非法内存。

代码示例

以下是一个简单的例子,展示了一个线程等待另一个线程完成某项任务:

#include <linux/module.h>
#include <linux/completion.h>
#include <linux/kthread.h>
#include <linux/delay.h>static struct completion my_completion;int worker_thread(void *data) {printk(KERN_INFO "Worker thread: Starting work\n");msleep(5000);  // 模拟工作printk(KERN_INFO "Worker thread: Work done, signaling completion\n");complete(&my_completion);return 0;
}static int __init my_module_init(void) {struct task_struct *task;init_completion(&my_completion);task = kthread_run(worker_thread, NULL, "worker_thread");if (IS_ERR(task)) {printk(KERN_ERR "Failed to create worker thread\n");return PTR_ERR(task);}printk(KERN_INFO "Main thread: Waiting for completion\n");wait_for_completion(&my_completion);printk(KERN_INFO "Main thread: Detected completion\n");return 0;
}static void __exit my_module_exit(void) {printk(KERN_INFO "Module exit\n");
}module_init(my_module_init);
module_exit(my_module_exit);MODULE_LICENSE("GPL");

这个例子创建了一个工作线程,该线程在完成工作后调用complete。主线程等待工作线程完成后继续执行。

总结

Linux内核中的completion机制是一个强大的工具,用于线程间的同步。通过合理使用它,可以有效地控制线程的执行顺序,确保程序的正确性。在使用时,应注意初始化、超时、中断安全等问题,以避免潜在的bug。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/38451.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

顺序串算法库构建

学习贺利坚老师顺序串算法库 数据结构之自建算法库——顺序串_创建顺序串s1,创建顺序串s2-CSDN博客 本人详细解析博客 串的概念及操作_串的基本操作-CSDN博客 版本更新日志 V1.0: 在贺利坚老师算法库指导下, 结合本人详细解析博客思路基础上,进行测试, 加入异常弹出信息 v1.0补…

已解决java.awt.geom.NoninvertibleTransformException:在Java2D中无法逆转的转换的正确解决方法,亲测有效!!!

已解决java.awt.geom.NoninvertibleTransformException&#xff1a;在Java2D中无法逆转的转换的正确解决方法&#xff0c;亲测有效&#xff01;&#xff01;&#xff01; 目录 问题分析 出现问题的场景 报错原因 解决思路 解决方法 1. 检查缩放因子 修改后的缩放变换 …

关键路径——C语言(理论)

关键路径&#xff0c;是项目网络中从起始事件到终止事件的最长路径&#xff0c;决定了项目的最短完成时间。 关键路径中的任务没有任何可调整的余地&#xff0c;如果任何一个任务被延迟&#xff0c;整个项目的完成时间也会被延迟。 假设我们现在有一个图&#xff1a;把图的边…

node编译打包Error: error:0308010C:digital envelope routines::unsupported

问题描述&#xff1a; 报错&#xff1a;Error: error:0308010C:digital envelope routines::unsupported 报错原因&#xff1a; 主要是因为 nodeJs V17 版本发布了 OpenSSL3.0 对算法和秘钥大小增加了更为严格的限制&#xff0c;nodeJs v17 之前版本没影响&#xff0…

【CH32V305FBP6】USBD HS 虚拟串口分析

文章目录 前言分析端点 0USBHS_UIS_TOKEN_OUT 端点 2USBHS_UIS_TOKEN_OUTUSBHS_UIS_TOKEN_IN 前言 虚拟串口&#xff0c;端口 3 单向上报&#xff0c;端口 2 双向收发。 分析 端点 0 USBHS_UIS_TOKEN_OUT 设置串口参数&#xff1a; 判断 USBHS_SetupReqCode CDC_SET_LIN…

玩转HarmonyOS NEXT之配置文件篇

配置文件概述 本文以Stage模型为例&#xff0c;详细介绍了HarmonyOS NEXT应用的各种配置文件&#xff0c;这些配置文件会向编译工具、操作系统和应用市场提供应用的基本信息。 在基于Stage模型开发的应用项目代码下&#xff0c;都存在一个app.json5的配置文件、以及一个或者多…

从零开始实现大语言模型(一):概述

1. 前言 大家好&#xff0c;我是何睿智。我现在在做大语言模型相关工作&#xff0c;我用业余时间写一个专栏&#xff0c;给大家讲讲如何从零开始实现大语言模型。 从零开始实现大语言模型是了解其原理及领域大语言模型实现路径的最好方法&#xff0c;没有之一。已有研究证明&…

《昇思25天学习打卡营第07天|函数式自动微分》

函数式自动微分 环境配置 # 实验环境已经预装了mindspore2.2.14&#xff0c;如需更换mindspore版本&#xff0c;可更改下面mindspore的版本号 !pip uninstall mindspore -y !pip install -i https://pypi.mirrors.ustc.edu.cn/simple mindspore2.2.14 import numpy as np imp…

Windows10录屏,教你3个方法,简单快速录屏

“我的电脑系统是Windows10的系统&#xff0c;今晚要进行线上开会&#xff0c;但我实在有事没办法参加会议&#xff0c;想把会议的内容录制下来方便我后续观看。但却找不到电脑录屏功能在哪里打开&#xff1f;求助一下&#xff0c;谁能帮帮我&#xff1f;” 在数字化时代&…

mysql 命令 —— 查看表信息(show table status)

查询表信息&#xff0c;如整个表的数据量大小、表的索引占用空间大小等 1、查询某个库下面的所有表信息&#xff1a; SHOW TABLE STATUS FROM your_database_name;2、查询指定的表信息&#xff1a; SHOW TABLE STATUS LIKE your_table_name;如&#xff1a;Data_length 显示表…

闲聊 .NET Standard

前言 有时候&#xff0c;我们从 Nuget 下载第三方包时&#xff0c;会看到这些包的依赖除了要求 .NET FrameWork、.NET Core 等的版本之外&#xff0c;还会要求 .NET Standard 的版本&#xff0c;比如这样&#xff1a; 这个神秘的 .NET Standard 是什么呢&#xff1f; .NET St…

【算法】字母异位词分组

题目&#xff1a;字母异位词分组 给你一个字符串数组&#xff0c;请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。 字母异位词 是由重新排列源单词的所有字母得到的一个新单词。 示例 1: 输入: strs [“eat”, “tea”, “tan”, “ate”, “nat”, “bat”] …

从零开始搭建spring boot多模块项目

一、搭建父级模块 1、打开idea,选择file–new–project 2、选择Spring Initializr,选择相关java版本,点击“Next” 3、填写父级模块信息 选择/填写group、artifact、type、language、packaging(后面需要修改)、java version(后面需要修改成和第2步中版本一致)。点击“…

【0300】Postgres内核动态哈希表实现机制(1)

相关文章&#xff1a; 【0299】Postgres内核之哈希表&#xff08;Hash Tables&#xff09; 0 概述 在【0299】Postgres内核之哈希表&#xff08;Hash Tables&#xff09;一文中&#xff0c;讲解了哈希表的作用、实现、优缺点等特性。本文开始&#xff0c;将详细分析Postgres内…

MySQL之应用层优化(三)

应用层优化 应用层缓存 2.本地共享内存缓存 这种缓存一般是中等大小(几个GB)&#xff0c;快速&#xff0c;难以在多台机器间同步。它们对小型的半静态位数据比较合适。例如每个州的城市列表&#xff0c;分片数据存储的分区函数(映射表)&#xff0c;或者使用存活时间(TTL)策略…

记录一次Chrome浏览器自动排序ajax请求的JSON数据问题

文章目录 1.前言2. 为什么会这样&#xff1f;3.如何解决&#xff1f; 1.前言 作者作为新人入职的第一天&#xff0c;mentor给了一个维护公司运营平台的小需求&#xff0c;具体需求是根据运营平台的某个管理模块所展示记录的某些字段对展示记录做排序。 第一步&#xff1a; myb…

工业触摸一体机优化MES应用开发流程

工业触摸一体机在现代工业生产中扮演着至关重要的角色&#xff0c;它集成了智能触摸屏和工业计算机的功能&#xff0c;广泛应用于各种生产场景中。而制造执行系统&#xff08;MES&#xff09;作为工业生产管理的重要工具&#xff0c;对于提高生产效率、降低成本、优化资源利用具…

力扣hot100-普通数组

文章目录 题目&#xff1a;最大子数组和方法1 动态规划方法2 题目&#xff1a;合并区间题解 题目&#xff1a;最大子数组和 原题链接&#xff1a;最大子数组和 方法1 动态规划 public class T53 {//动态规划public static int maxSubArray(int[] nums) {if (nums.length 0…

C++基础知识-编译相关

记录C语言相关的基础知识 1 C源码到可执行文件的四个阶段 预处理(.i)、编译(.s)、汇编(.obj)、链接。 1.1 预处理 预处理阶段&#xff0c;主要完成宏替换、文件展开、注释删除、条件编译展开、添加行号和文件名标识&#xff0c;输出.i/.ii预处理文件。 宏替换&#xff0c;…

【UML用户指南】-26-对高级行为建模-状态图

目录 1、概念 2、组成结构 3、一般用法 4、常用建模技术 4.1、对反应型对象建模 一个状态图显示了一个状态机。在为对象的生命期建模中 活动图展示的是跨过不同的对象从活动到活动的控制流 状态图展示的是单个对象内从状态到状态的控制流。 在UML中&#xff0c;用状态图…