linux 同步机制之complete

【Linux 内核中等待 completion 事件 API--wait_for_completion_interruptible_timeout 】 是 Linux 内核中用于等待 completion 事件的一个函数,它结合了等待 completion 的功能、可中断性(即如果线程在等待过程中接收到信号,它会提前返回)以及超时机制。如果等待时间超过5秒,或者等待过程中。函数,并传入相应的 completion 变量和超时时间。将返回,然后可以根据返回值判断是超时还是被信号中断。初始化一个 completion 变量,通常使用。在需要等待 completion 的线程中,调用。在另一个线程中,当某个任务完成时,调用。函数来标记 completion。 阅读详情

在Linux内核中,completion是一种简单的同步机制,标志"things may proceed"。

要使用completion,必须在文件中包含<linux/completion.h>,同时创建一个类型为struct completion的变量。

[cpp]  view plain copy
  1. 这个变量可以静态地声明和初始化:  
  2. DECLARE_COMPLETION(my_comp);  
  3. 或者动态初始化:  
  4. struct completion my_comp;  
  5. init_completion(&my_comp);  

如果驱动程序要在执行后面操作之前等待某个过程的完成,它可以调用wait_for_completion ,以要完成的事件为参数:

[html]  view plain copy
  1. void wait_for_completion(struct completion *comp);  

wait_for_completion等待在completion上。如果加了interruptible,就表示线程等待可被外部发来的信号打断;如果加了killable,就表示线程只可被kill信号打断;如果加了timeout,表示等待超出一定时间会自动结束等待,timeout的单位是系统所用的时间片jiffies(多为1ms)。

如果其它部分代码可以确定事件已经完成,可以调用下面两个函数之一来唤醒等待该事件的进程:

[cpp]  view plain copy
  1. void complete(struct completion *comp);  
  2. void complete_all(struct completion *comp); /* Linux 2.5.x以上版本 */  

前一个函数将只唤醒一个等待进程,而后一个函数唤醒等待该事件的所以进程。由于completion的实现方式,即使complete在wait_for_competion之前调用,也可以正常工作。
例如,在MD设备驱动程序实现中,有一个恢复线程md_recovery_thread。驱动程序通过md_register_thread和md_unregister_thread来注册和注销恢复线程。恢复线程的执行逻辑在md_thread函数中,大致如下:

[cpp]  view plain copy
  1. int md_thread(void * arg)  
  2. {  
  3.     线程初始化;  
  4.     while (运行) {  
  5.         处理逻辑;  
  6.         接收信号;  
  7.     }  
  8.     return 0;  
  9. }  

md_register_thread将创建一个恢复线程,它必须在线程真正初始化结束之后才能返回该线程的指针。因此,其逻辑是:

[cpp]  view plain copy
  1. mdk_thread_t *md_register_thread(void (*run) (void *), void *data, const char *name)  
  2. {  
  3.     mdk_thread_t *thread;  
  4.     ……  
  5.     struct completion event;  
  6.     /* 为线程分配空间 */  
  7.     thread = (mdk_thread_t *) kmalloc (sizeof(mdk_thread_t), GFP_KERNEL);  
  8.     ……  
  9.     init_completion(&event);  
  10.     ……  
  11.     thread->event = &event;  
  12.     /* 创建内核线程 */  
  13.     ret = kernel_thread(md_thread, thread, 0);  
  14.     /* 等待线程初始化结束 */  
  15.     ……  
  16.     wait_for_completion(&event);  
  17.     /* 返回线程指针 */  
  18.     return thread;  
  19. }  


而md_unregister_thread通过向线程发送SIGKILL信号注销恢复线程,它也需要在线程真正退出后才能释放线程所占用的内存。因此,其逻辑是:

[cpp]  view plain copy
  1. void md_unregister_thread(mdk_thread_t *thread)  
  2. {  
  3.     struct completion event;  
  4.     init_completion(&event);  
  5.     thread->event = &event;  
  6.     ……  
  7.     /* 向线程发送SIGKILL信号终止其运行 */  
  8.     md_interrupt_thread(thread);  
  9.     /* 等待线程退出 */  
  10.     wait_for_completion(&event);  
  11.     /* 释放线程所占用的内存 */  
  12.     kfree(thread);  
  13. }  

如果考虑completion,md_thread的逻辑是:

[cpp]  view plain copy
  1. int md_thread(void * arg)  
  2. {  
  3.     线程初始化;  
  4.     complete(thread->event);   
  5.     while (运行) {  
  6.         处理逻辑;  
  7.         接收信号;  
  8.     }  
  9.     complete(thread->event);   
  10.     return 0;  
  11. }  

需要说明的是,由于等待事件是在驱动程序和恢复线程中的一个共享资源,它必须是一个全局变量,或者如实现代码中,定义为一个局部变量,而将其指针放在恢复线程结构中。
typedef struct mdk_thread_s {
    ……
    struct completion *event;
    ……
} mdk_thread_t;

wait_for_completion_timeout 简介 参数说明第一个参数:指向 struct completion 结构体的指针,包含等待队列信息及状态第二个参数:unsigned long 类型变量,表示等待的超时时间(以时钟节拍为单位)[1][2]返回值返回剩余的系统时钟节拍数(传入的超时时间减去等待消耗的时间)如果等待正常结束,返回值范围在 0 到传入的超时时间之间如果返回 0,表示等待超时[1][2] 阅读详情

相关推荐

Linux内核之completion机制

Linux内核之completion机制

大吉 1941

linux kernel中的wait_for_completion和complete总结

文章目录结构体init_completioncompletewait_for_completion 结构体 struct completion { unsigned int done; wait_queue_head_t wait; }; #define UINT_MAX (~0U) init_completion #define init_completion(x) __init_completion(x) static inline void __init_completion(struct

baron-周贺贺-代码改变世界ctw 7800

内核同步机制——完成量

<!-- @page {margin:0.79in} p {margin-bottom:0.08in} --> 内核中的许多部分初始化某些活动为单独的执行线程,然后等待这些线程完成。完成接口是一种有效并简单的方式来实现这样的代码模式。 <!-- @page {margin:0.79in} p {margin-bottom:0.08in} -->

山庄来客的专栏 978

linux 内核同步机制之complete

在Linux内核中,completion是一种简单的同步机制,标志"things may proceed"。 要使用completion,必须在文件中包含<linux/completion.h>,同时创建一个类型为struct completion的变量。 这个变量可以静态地声明和初始化: DECLARE_COMPLETION(my_comp); 或者动态初始化: struct completion my_comp; init_compl.

u014426028的博客 1210

【计算机组成原理实验】状态机实验

理解“状态机”概念,掌握“状态机”思想描述时序系统。通过下列三种基于D触发器的计数器结构,构建状态机的状态转移电路:环形计数器、扭环计数器和条件判断的扭环计数器。基于“状态机”原理,设计一个“交通灯”系统:控制红黄绿信号灯按照以下顺序循环点亮:“绿 黄 红 绿 ……”,红灯、绿灯和黄灯的亮灯持续时间可以通过拨码开关独立设置。红灯和绿灯是持续亮灯模式,黄灯则是闪烁亮灯模式。

Rover_jb的博客 1332

【Python・统计学】(两)多因素方差分析(原理及代码)

自学笔记,分享给对统计学原理不太清楚但需要在论文中用到的小伙伴,欢迎大佬们补充或绕道。ps:本文不涉及公式讲解(文科生小白友好体质)~(部分定义等来源于知乎) 本文重点:多因素方差分析 【1.多因素方差分析简单原理】 【2.多因素方差分析步骤】 【3.多因素方差分析代码】

TUTO_TUTO的博客 4864

linux 同步机制之complete【转】

转自: http://blog.youkuaiyun.com/wealoong/article/details/8490654 在Linux内核中,completion是一种简单的同步机制,标志"things may proceed"。 要使用completion,必须在文件中包含&lt;linux/completion.h&gt;,同时创建一个类型为struct completion的变量。 ...

weixin_34007886的博客 84

别再手动挂载NPU了!手把手教你用Ascend-Docker-Runtime一键启动昇腾AI容器

本文详细介绍了如何使用Ascend-Docker-Runtime一键启动昇腾AI容器,大幅简化NPU设备挂载流程。通过环境变量ASCEND_VISIBLE_DEVICES,开发者可以灵活指定NPU设备,提升开发效率。文章还提供了安装配置指南、高级使用技巧和常见问题排查方法,帮助开发者快速掌握这一高效工具。

weixin_42662605的博客 252

【微代码】Linux同步机制complete基本用法,以及如何封装一个内核态sleep的工具函数ksleep?

Linux提供了多种同步机制,其中complete就是一种。complete能够阻塞等待状态同步,并且等待对方释放中会调用schedule让出CPU。如果想在内核中等待一个固定时长继续执行他是一个非常不错的选择。有点类似用户态的sleep功能。可以定义一个函数,在函数中定义,等待来达到类似sleep的效果。下面的代码可以直接copy后使用。

技术札记 548

量化交易 米筐 因子分组打分(成长因子)

分组动手练习 在米筐上因子数据没有处理,提供的很多因子没有默认分类,存在一些因子没有的情况,我们就选择一些常见的因子。 价值因子 质量因子 成长因子(历史名称) pe_ratio return_on_invested_capital in_revenue pcf_ratio du_return_on_equity inc_eps pb_ratio return_on_asset_net_profit inc_total_asset market_cap return_on_equ

廷益_飞鸟的博客 932

新手必看!手把手教你在群晖 NAS 上玩转 Docker 容器(Container Manager)!(群晖 NAS 如何创建 Docker 容器以及 Compose 部署项目)

新手必看!手把手教你在群晖 NAS 上玩转 Docker 容器(Container Manager)!(群晖 NAS 如何创建 Docker 容器以及 Compose 部署项目)

XiaoqiangClub的博客 5161

linux同步机制-complete

linux驱动程序中可以使用的同步机制有很多,这里只介绍complete机制。 1. 什么是complete? completion,它用于一个执行单元等待另一个执行单元执行完某事。Linux系统中与completion相关的操作主要有以下4种: (1) 定义completion struct completion my_completion; (2) 初始化completion init_completion(&my_...

DSP小胖的博客 2423

Yolo11改进:Block改进|MixDehazeNet,用于图像去雾网络的混合结构块|即插即用|附代码

https://arxiv.org/pdf/2305.17654 图像去雾是低级视觉领域中的一项典型任务。先前的研究验证了大型卷积核和注意力机制在去雾中的有效性。然而,存在两个缺点:引入大型卷积核时容易忽略图像的多尺度特性,而注意力模块的标准串联方式没有充分考虑雾分布的不均匀性。在本文中,我们提出了一种名为混合结构图像去雾网络(MixDehazeNet)的新型框架,该框架解决了上述两个问题。具体而言,它主要由两部分组成:多尺度并行大型卷积核模块和增强并行注意力模块。与单个大型卷积核相比,多尺度的并行大型卷积

m0_47867638的博客 1269

linux complete同步机制 一

Linux系统提供了一种比信号量更好的同步机制,即completion,它用于一个执行单元等待另一个执行单元执行完某事。Linux系统中与completion相关的操作主要有以下4种:       (1) 定义completion           struct completion my_completion;       (2) 初始化completion           ini

yuantian2987的专栏 2456

代谢组数据分析(三十一):空间代谢组学分析从数据加载到通路分析的流程解析

空间代谢组学是一种先进的技术,能够在组织切片上以高分辨率检测代谢物分布,为理解生物代谢过程提供新视角。其分析流程包括数据获取、预处理、代谢物注释、差异表达分析、可视化、通路分析、聚类分析及空间相关代谢物分析等关键步骤。这些步骤帮助研究人员从海量数据中提取有价值信息,揭示代谢物的空间分布规律,发现潜在生物标志物,探索代谢通路调控机制。例如,SpaMTP等工具为全流程分析提供了强大支持,助力研究人员高效处理数据,深入理解代谢过程,为生物学研究和临床应用提供重要依据。

专注生信领域 912

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

linux 同步机制之complete wait_for_completion

在Linux内核中,completion是一种简单的同步机制,标志"things may proceed"。 要使用completion,必须在文件中包含,同时创建一个类型为struct completion的变量。 [cpp] view plaincopy 这个变量可以静态地声明和初始化:   DECLARE_COMPLETION(my_comp);  

liuxd3000的专栏 2万+

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Linux内核同步机制completion学习(DECLARE_COMPLETION wait_for_completion complete)

我这里主要记录我实际测试效果,相关的Linux内核同步机制completion介绍可以参考下面几个帖子: http://blog.youkuaiyun.com/bullbat/article/details/7401688 http://blog.youkuaiyun.com/liuxd3000/article/details/17912695 http://blog.youkuaiyun.com/davion_zhang

海月汐辰 1431

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Linux 内核Complete和wait_for_completion

1. Linux中很多同步机制,completion是

firefox_1980的专栏 2098

Linux内核宏--complete介绍

complete`宏的定义位于`<linux/completion.h>`头文件中,其基本形式如下:```cdo { \else \```该宏接受一个指向`struct completion`类型的变量作为参数。当调用`complete`时,它会:1. **增加完成计数**:将传递的`struct completion`结构体中的`done`字段值加1,表示有一个事件完成了。

MHD0815的博客 1511
上一篇: request_irq() linux注册中断服务
下一篇: 修改Android开机图片
计算机与认知
博客等级 码龄14年 31粉丝 19原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值