Linux内核开发之并发控制(四)

Unity Odin从入门到精通(二):创建编辑器窗口 前言:为了更加快速和高效的组织项目数据,开发者可以使用Odin来快速创建自定义编辑器窗口,以帮助组织项目数据。这就是Odin可以真正帮助提升工作流程的地方。 阅读详情

出招表七:信号量(信号量其实和自旋锁是一样的,就是有一点不同:当获取不到信号量时,进程不会原地打转而是进入休眠等待状态)

Linux系统中与信号量相关的操作主要有一下4种:

1)定义信号量    struct semaphore sem;

2)初始化信号量   

void sema_init (struct semphore *sem, int val);    //设置sem为val

void init_MUTEX(struct semaphore *sem);    //初始化一个用户互斥的信号量sem设置为1

void init_MUTEX_LOCKED(struct semaphore *sem);    //初始化一个用户互斥的信号量sem设置为0

DECLARE_MUTEX(name);     //该宏定义信号量name并初始化1

DECLARE_MUTEX_LOCKED(name);    //该宏定义信号量name并初始化0

3)获得信号量

void down(struct semaphore *sem);    //该函数用于获取信号量sem,会导致睡眠,不能被信号打断,所以不能在中断上下文使用。

int down_interruptible(struct semaphore *sem);    //因其进入睡眠状态的进程能被信号打断,信号也会导致该函数返回,这是返回非0。

int down_trylock(struct semaphore *sem);//尝试获得信号量sem,如果能够获得,就获得并返回0,否则返回非0,不会导致调用者睡眠,可以在中断上下文使用

一般这样使用

if(down_interruptible(&sem))

{

    return  - ERESTARTSYS;

}

4)释放信号量

void up(struct semaphore *sem);    //释放信号量sem,唤醒等待者

信号量一般这样被使用,如下所示:

//定义信号量

DECLARE_MUTEX(mount_sem);

down(&mount_sem);//获取信号量,保护临界区

…

critical section //临界区

…

up(&mount_sem);

好了,下边给大家一个例子看看使用信号量来实现设备只能被一个进程打开的例子:

static DECLARE_MUTEX(xxx_lock);//定义互斥锁

static int xxx_open(struct inode *inode, struct file *filp)

{

   …

   if(down_trylock(&xxx_lock))    //获得打开锁

       return – EBUSY; //设备忙

   …

   return 0;//成功

}

 

static int xxx_release(struct inode *inode, struct file *filp)

{

    up(&xxx_lock);    //释放打开锁

    return 0;

}

在上面介绍的有关信号量的操作中,我们提到了一个问题就是信号量的初始化问题,一般对信号量的初始化是没有限制的,但如果信号量被初始化为0,则它可以用于同步,说到这里,就不得不介绍新的一招了

 

出招表八:同步(它意味着一个执行单元的继续执行需要等待另一个执行单元完成其事,保证了执行的先后顺序)

    tongbu

在这个图中,执行单元A执行代码区域b之前,必须等待执行单元B执行完代码单元c,而信号量刚好可辅助完成这一同步过程. 

 

这时你可能要问,像这样的同步,在现实中可是常常遇到.比如,报名时必须等前一项完成了才能完成后一项..等等,是不是同步就这么一种方式啊..

呵呵,真聪明,小菜终于长大了,成为大菜了.其实,Linux系统提供了一种更好的同步机制----完成量,好吧,看在你求学若渴的份上,就把它一起传授给你了,不收费哦,呵呵

出招表九:完成量(completion),它用于一个执行单元等待另一个执行单元执行完某事

使用方法:1)定义完成量

            struct completion my_completion;

            2)初始化

            init_completion(&my_completion); //要是觉得这两步麻烦,就再给你来个宏即定义又初始化DECLARE_COMPLETION(my_completion);

            3)等待完成量

            void wait_for_completion(structcompletion *c);   //等待一个completion被唤醒

            wait_for_completion_interruptible(struct completion *c); //可中断的wait_for_completion

            unsigned long wait_for_completion_timeout(struct completion *x,unsigned long timeout);  //带超时处理的wait_for_completion

            4)唤醒完成量

            void complete(struct completion *c);   //只唤醒一个等待的执行单元。

            void complete_all(struct completion *c);   //唤醒所有等待这个完成量的执行单元

瞧我这记性,说了这么多,怎么就忘了给出completion结构体呢:

struct completion

{ 

     unsigned int done;//标志是否已经做完,未做完就是负值,代表等待个数,完成为0

     wait_queue_head_t wait;

}

如果觉得不太理解,不过瘾,就给你来张图:

   completion

这下感觉怎样,好多了吧...

说句真的,我都没想到,这点东西要将那么久,虽然不愿意,但只能说:欲知后事如何,咱们下回接着再聊..

Unity编辑器扩展:基于Odin插件的多菜单树架构设计与实现 在Unity编辑器开发中,菜单树是构建复杂管理工具的核心界面组件,它通过层级化结构组织功能模块,提升工具的导航效率与用户体验。其原理在于将数据模型与视图分离,通过树形数据结构管理菜单项,并利用事件驱动实现交互响应。这种架构的技术价值在于支持模块化开发,允许不同功能域独立维护,同时通过灵活的布局模式(如标签页、分割视图)适应多样化的工具需求。在实际应用场景中,面对角色配置、关卡编辑、物品数据库等大型项目管理时,单一菜单树往往难以维护,而采用多个OdinMenuTree实例的解决方案,能够实现清晰的职责分离与性 阅读详情

相关推荐

Java服务端实现Google Pay支付功能

全网最全代码、最清晰服务端处理Google Pay,最清晰讲解Google Pay集成逻辑。

jack2350536098的博客 1万+

内核并发控制---完成量 (来自网易)

定义在头文件linux/completion.h中; 完成量(completion)是Linux系统提供的一种比信号量更好的同步机制,是对信号量的一种补充;它用于一个执行单元等待另一个执行单元完成某事;使用完成量等待时,调用进程是以独占睡眠方式进行等待的;不是忙等待; 1).定义完成量: struct completion my_completion;    //定义完成量my_comple

wangpengqi的专栏 798

stm32学习笔记-启动文件

1、配置栈 Stack_Size EQU 0x00000400 AREA STACK, NOINIT, READWRITE, ALIGN=3 Stack_Mem SPACE Stack_Size __initial_sp EQU:相当于C中的define,定义Stack_Size = 0x00000400。 AREA: 指...

某风吾起的博客 4529

【linux kernel】一文总结linux内核的完成量机制

文章目录一、completion完成量二、使用方法(2-1)初始化完成量(2-1-1)动态初始化完成量(2-1-2)静态声明和初始化完成量(2-2)等待完成量(2-3)发送信号量完成(2-4) try_wait_for_completion()/completion_done()三、使用实例 一、completion完成量 linux内核中,completion是一种代码同步机制。如果有一个或多个线程必须等待某个内核活动操作达到某个点或某个特定状态,那么completion完成量可以提供一个无竞争的解决方案

iriczhao的博客 3705

xctf攻防世界 MISC高手进阶区 low

1. 进入环境,下载附件 给出的一张bmp图片,没有其他信息 2. 问题分析 扔进binwalk中,没有发现有用信息 使用zsteg,没有有用信息 塞入StegSolve中,发现有点猫腻,如图: 有点二维码的感觉,emmm,需要像素处理,但不知道如何下手,参考网上的wp,发现是让使用lsb隐写,copy代码: from PIL import Image img = Image.open('./pic/low.bmp') img_tmp = img.copy() pix = img_tmp.load()

l8947943的博客 1万+

AutoDock Vina多配体对接 (Simultaneous Multiple Ligand Docking)

多配体分子对接(Simultaneous Multiple Ligand Docking, SMLD)或(Multiple Ligand Simultaneous Docking, MLSD)是一种分子对接技术,用于将多个配体(小分子药物候选物)同时对接到一个蛋白质分子的结合位点。与传统的分子对接技术不同,传统方法通常只考虑一个配体与一个蛋白质的相互作用。SMLD的目标是更高效地研究多个配体如何与同一个蛋白质相互作用,以寻找潜在的药物候选物。

MurphyStar的博客 7146

Linux completion完成量说明

completion是内核中的一种同步机制,该机制主要借助等待队列实现同步,该同步机制是一种简单的同步机制。4 下面简要分析下该同步机制的实现(本次源码基于linux 3.10)。 一、结构体说明 struct completion { unsigned int done; wait_queue_head_t wait; }; 主要包括等待队列头以及完成量统计值done...

lickylin的专栏 2032

电力-平衡式IEC 60870-5-101规约报文解析

本文详细介绍了电力自动化中平衡式IEC 60870-5-101规约的应用,包括链路建立与初始化、对时、遥控操作、数据上送和总召唤等关键步骤,通过实例解析了报文格式和交互过程,是理解配网自动化通信的重要参考资料。

让你爱上电路设计 5684

USB的内核线程 与 完成量之间的关系 赏析

先看完成量usb重要的内核线程睡眠与唤醒 /** 看,完成量是由 等待队列 + 原子变量 来实现的。 那么,问题是 : 他们是怎么样来实现完成量的呢? 他的初始化函数会将done 设置为0 再complete()加1,wait_for_completion(以及他衍生出来的函数)减 1 再初始化函数中会初始化等待队列,

500 997

基于DRU-HVDC的构网型海上风电场环流机理仿真复现

本文介绍了基于DRU-HVDC的构网型海上风电场环流机理仿真模型的构建方法。主要内容包括: 完整的Simulink模型结构,包含主模型文件GFM_DRU_Main.slx和配置脚本GFM_DRU_Setup.m 系统参数设置,包括基础频率(20Hz)、电压基准值(690V)、功率基准值(2MVA)等 四种仿真场景配置:电压不平衡、相位不平衡、阻抗不平衡和频率不平衡 风力发电机(WT)子系统的详细构建步骤,包含电压源、输出阻抗和测量模块 变压器和DRU整流器的参数设置 该模型可用于研究构网型风电场的环流机理。

huanghm88的专栏 262

1、硬件工程师笔面试真题汇总(2025版本)

答:按照使用习惯,电源指示灯用红色,信号指示灯用绿色这两种颜色的LED 灯技术最成熟,价格最便宜通孔是贯穿整个PCB 的过孔盲孔是从PCB 表层连接到内层的过孔埋孔是埋在PCB 内层的过孔。大多数PCB厂家的加工能力是这样的:大于等于8mil 的过孔可以做机械孔小于等于6mil 的过孔需要做激光孔对小于等于6mil 的微型孔,在钻孔空间不够时,允许一部分过打在PCB 焊盘上。

XU157303764的博客 2万+

linux并发控制之完成量

完成量:表示一个执行单元需要等待另一个执行单元完成某事后方可执行。 1.它是一种轻量级机制,为了完成进程间的同步而设计 2.使用完成量等待时,调用进程是以独占睡眠方式进行等待的 3.不是忙等待 理解: 定义于#include 其结构体为 struct completion { unsigned int done; wait_queue_head_t wait; };

williamwang2013的专栏 3408

Android 13 RK3588 编译烧写实录全程

本文详细记录了RK3588主板在Android 13系统下的各项功能测试与编译过程。主要内容包括:1)网络功能测试(以太网、WiFi、蓝牙连接);2)外设接口测试(耳机、麦克风、USB、TF卡);3)硬件功能验证(RTC时钟、ADC采样、MIPI摄像头);4)系统设置(手势导航、开发者选项);5)Android 13 SDK编译环境搭建与源码获取方法。通过图文并茂的方式展示了各功能的配置方法、操作步骤和测试结果,为开发者提供了全面的参考指南。

hnjzfwy的博客 239

2024-07-23 Unity插件 Odin Inspector11 —— 使用 Odin 自定义编辑窗口

​ OdinMenuTrees 能够轻松强大和灵活的自定义菜单树外观。如果希望将自定义编辑器 IMGUI 代码与 Odin 绘制的编辑器混合在一起,则可以使用 OnInspectorGUI 属性。不应重写 OdinEditorWindows 中的 OnGUI() 方法。

zheliku的博客 2259

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Unity编辑器拓展OdinMenuEditorWindow(一)

Unity编辑器拓展OdinMenuEditorWindow(一)

hack_yin的博客 2943

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Unity编辑器效率提升:Odin插件实战指南(含脚本模板自动生成与资源管理技巧)

本文深入探讨了如何利用Odin插件结合Unity的AssetDatabase和System.IO等原生API,构建高效的编辑器自动化工作流。内容涵盖脚本模板自动生成、批量资源管理以及高级性能优化技巧,旨在帮助开发者大幅提升Unity编辑器内的开发效率,减少重复性劳动。

yhn456789的博客 717

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

Odin Inspector 系列教程 --- 初识 OdinWindow

笔者以往在使用一些插件的时候经常会看上面这种多炫酷的插件操作界面,常常羡慕不已,如今有了Odin,自己也可以简简单单的实现这些炫酷的效果了,下面笔者就带大家初识OdinWindow。 创建一个Window 不积跬步无以至千里,我们先从最简单的创建一个Window开始,只需要自定义一类并继承OdinEditorWindow即可 public cl...

su9257的博客 2894

【Unity】Odin插件实战:高效编辑器工具链开发(脚本生成、资源管理、批量处理)

本文详细介绍了如何利用Odin插件高效开发Unity编辑器工具链,涵盖脚本自动化生成、预制体与ScriptableObject资源管理以及批量处理等核心场景。通过对比传统方式与Odin的声明式编程,展示了如何快速创建功能强大的EditorWindow,大幅提升开发效率与项目规范性。

b0c1d2的博客 321

【Unity】Odin插件实战:打造高效资源管理工具链(脚本生成、预制体创建、批量处理)

本文详细介绍了如何利用Unity的Odin插件构建高效的编辑器工具链,实现脚本模板化生成、预制体自动化创建以及资源批量处理。通过结合AssetDatabase和System.IO等原生API,开发者可以大幅提升资源管理效率,减少重复劳动,并确保团队协作的规范性。

weixin_29007135的博客 444

EditorWindow

这个类用来创建窗口,创建自己的自定义编辑器窗口,可以自由浮动或作为一个标签停靠,就像在Unity接口的本地窗口 通常编辑器窗口是使用一个菜单项打开。 使用:  [MenuItem ("Window/My Window")] 添加一个菜单项 变量: wantsMouseMove GUI在这个编辑器窗口是否想要MouseMove

Bambom的专栏 1080

Wing 云语言资源继承实战:扩展 cloud.Counter 的编译产物与 tf-aws 部署解析

> 本篇文章以 Wing 仓库中的 `extend_counter.test.w` 测试及其 tf-aws 编译快照为主线,深入讲解如何在 Wing 语言中继承标准云资源 `cloud.Counter`,自定义字段与 inflight 方法,并通过 `super` 复用父类实现;同时逐文件拆解 Wing 编译器产出的 preflight/inflight 代码与 Terraform 配置,帮助你理

gitblog_00540的博客 143

Linux内核开发之并发控制(实例总结篇)

"小王,小王,别睡了,瞧你,咋还睡着了呢…"我催促他说. "现在是公元前还是公元后啊,我的MM等急了没.."呵呵,看他一脸傻笑。 提醒各位路过的MM,如果没有男友的,可以联系小王,电话:拐拐拐。“什么,我的,呵呵,没办法,谁让我这有才呢..” 算算前边有关并发控制的有关内容,都到五了,一连来了十一招,今天也不好意思再卖官子了,做一个最后的实例总结篇,下一节,就要开始新的内容了哦,没赶上的可要加油了

数据挖掘及搜索专栏 512

Linux内核开发之异步通知与异步I/O(五)

“小王呢,今天开始讲AIO与设备驱动,这也是设备驱动通知与异步IO的最后一节了,下次咱们就要开始讲更高级的东西,比如中断啦,时钟等”   在Linux内核中,每个IO请求都对应一个kiocb结构体,其ki_filp成员指向对应的file指针,通过is_sync_kiocb可以判断某Kiocb时候为同步IO请求,如果非真,表示是异步IO请求。   块设备和网络设备本身就是异步的。只有字符设备驱动必须

数据挖掘及搜索专栏 491

Linux内核开发之异步通知与异步I/O(一)

“小王,听说过锦上添花吧..”我拍拍下王的头说。 “还锦上添花你,为你上次提的几个东东,我是头上长包..”小王气愤地瞪着我。 “啊,为啥这样呢,本来还特意拒绝了MM的月份,抽出时间打算给你说点高级的东东,看来现在是不行了”我吃惊道,“这样吧,这次就给你讲些和前边有关的东西,也不失为锦上添花不是?”。 “好,我也是这么打算的,就是没好意思说,今天讲些啥呢?”小王暗淡的眼光总算闪了闪。(为啥这么

数据挖掘及搜索专栏 456

Linux内核开发之简单字符设备驱动(下)

在上一篇中,我们介绍了有关简单字符设备驱动中那些简单但又必须要掌握的结构体和一些源码中核心的操作函数,这一节我们继续介绍有关源码部分的后续相关内容及测试使用的方法(在本文中同时也会给出完整的Makefile文件,方便大家调试)。 static const struct file_operations globalmem_fops = { //这些就是上篇中所实现的所有操作该字符设备的函数接口,这

数据挖掘及搜索专栏 440

Linux内核开发之内存与I/O访问(六)

“小王,再告诉你一个好消息,今天是咱们设备驱动程序核心基础理论的最后一节课了,战斗就已经到了最后一刻了,开心不”我眉飞色舞的对小王说。 “嗯,开心,我挣扎许久了,终于结束了,只是..”小王伤感的说“只是我觉得怎么能一下就没了呢, 心里空荡荡的”. “没关系的…”看着小王噘着嘴调皮而又可爱的样子,我也心软了”核心的理论是讲完了,但你不是没动过手吗,还有很多路要走呢..我还舍…”我一把蒙住自己的嘴.

数据挖掘及搜索专栏 413
上一篇: Linux内核开发之并发控制(三)
下一篇: Linux内核开发之并发控制(五)
wustdatamining
博客等级 码龄15年 12粉丝 81原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值