【讯为Linux驱动开发】6.自旋锁spinlock

【自旋锁】

线程A获取自旋锁后,B假如想获取自旋锁则只能原地等待,仍占用CPU不会休眠,直到获取自旋锁为止。

【函数】

DEFINE SÃINLOCK(spinlock t lock)   定义并初始化一个变量
int spin lock init(spinlock t*lock)   初始化自旋锁
void spin lock(spinlock t *lock)    获取自旋锁。也叫做加锁
void spin_unlock(spinlock t *lock)    释放自旋锁,也叫做解锁
int spin trylock(spinlock t *lock)    尝试获取自旋锁,如果没有获取到就返回0
int spin is locked(spinlock t *lock)   检查自旋锁是否被获取,如果没有被获取就返回非0,否则返回0

【如何使用】

  1. 访问临界资源时首先申请自旋锁
  2. 获取自旋锁后进入临界区,获取不到就等待
  3. 退出临界区释放自旋锁 

【临界区】

【注意事项】 

  1. 原地等待消耗CPU。临界区代码一定不能多。
  2. 临界区中不可以调用会导致进程休眠的函数,否则可能死锁
  3. 一般用于多核CPU

【实验】

/* 定义一个自旋锁 */
static spinlock_t my_spinlock;
static flag = 1;  //标志位模拟驱动有没有被用到static int cdev_open(struct inode *inode, struct file *filp)
{spin_lock(my_spinlock);  //加锁if(flag != 1){spin_unlock(my_spinlock); return -EBUSY;}flag = 0;spin_unlock(my_spinlock);  //解锁file->private_data = &dev1; //指向设备结构体return 0;
}static int cdev_release(struct inode *inode, struct file *filp)
{spin_lock(my_spinlock);  //加锁flag = 1;spin_unlock(my_spinlock);  //解锁      
}

【验证】

int main(int argc, char *argv[])
{int fd1;char buf1[32] = "ni hao test1!";fd1 = open("/dev/test1", HELLO);  /* 打开设备节点1 */   sleep(5);  /* 延时5秒,为了实验效果*/close(fd1);return 0;  
}

【实验结果】

A打开驱动程序,假设执行到FLAG = 0,此时又有B要使用驱动,那么Flag = 0意味着A正在使用驱动,同时Flag =0 使得flag !=1所以B进不去驱动,只能报错。

当等A使用驱动完毕,触发release函数,flag被置为1,才意味着其他程序可以使用驱动了。

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

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

相关文章

技术速递|Java on Azure Tooling 5月更新 - Java 对 Azure 容器应用程序的入门指南支持

作者:Jialuo Gan 排版:Alan Wang 大家好,欢迎阅读 Java on Azure 工具 5 月份更新。在本次更新中,我们将介绍 Java 在 Azure 上的容器应用程序的入门指南。希望您喜欢这些更新,并享受使用 Azure 工具包的流畅体验。请下…

Python中用pip命令用稳定的国内源安装第三方库

近期发现python中安装三方库的最稳定的方式还是用pip命令,带上国内源的地址。 比如清华源: pip install 包名 -i https://pypi.tuna.tsinghua.edu.cn/simple/ 用这个带国内源的格式,非常稳定!

audio标签怎么使用

<audio> 标签在 HTML 中用于嵌入音频内容&#xff0c;如音乐、歌曲、音效等。这个标签允许你在网页上直接播放音频&#xff0c;而无需依赖任何外部播放器或插件&#xff08;如过去的 Flash 插件&#xff09;。 以下是如何使用 <audio> 标签的基本示例&#xff1a;…

oss一个桶中如何创建多个文件夹并在上传文件时上传到相应指定的桶中

在阿里云OSS&#xff08;Object Storage Service&#xff09;中&#xff0c;文件夹的概念实际上是一个逻辑上的概念&#xff0c;因为OSS是一个基于对象的存储服务&#xff0c;而不是基于文件系统的。但是&#xff0c;你可以通过为对象指定特定的key来模拟文件夹结构。以下是如何…

《pvz植物大战僵尸杂交版》V2.0.88整合包火爆全网,支持安卓、ios、电脑等!

今天来给大家安利一款让人欲罢不能的游戏——《植物大战僵尸杂交版》2.0.88版。这可不是普通的植物大战僵尸&#xff0c;它可是席卷了B站&#xff0c;火爆全网的存在&#xff01; 先说说这个版本&#xff0c;它可是网络上现存最全的植物大战僵尸杂交版整合包。里面不仅有修改工…

什么是 OSI 模型?

OSI 模型&#xff08;开放式系统互联模型&#xff09;是一个由国际标准化组织&#xff08;ISO&#xff09;提出的概念模型&#xff0c;旨在为计算机网络的互联互通提供标准框架&#xff08;定义于 ISO/IEC 7498-1&#xff09;。该模型将通信系统中的数据流划分为七个层&#xf…

uni-app中添加路由拦截

uni-app中添加路由鉴权和路由拦截 在main.js中添加如下代码 let list ["navigateTo", "redirectTo", "reLaunch", "switchTab"] let routesWhitelist [/pages/tabs/classify,/pages/tabs/study,/pages/tabs/mine] // 可以直接跳转的…

torch.squeeze() dim=1 dim=-1 dim=2

对数据的维度进行压缩 使用方式&#xff1a;torch.squeeze(input, dimNone, outNone) 将输入张量形状中的1 去除并返回。 如果输入是形如(A1B1C1D)&#xff0c;那么输出形状就为&#xff1a; (ABCD) import torch x torch.rand(2, 1, 1, 3, 1, 4) print(x) print(x.shape) …

wms海外仓系统什么价格?中小海外仓怎么选到高性价比wms系统

随着海外仓业务复杂度的逐渐提升&#xff0c;现在中小海外仓对wms海外仓系统的需求也越来越强烈。但是对于预算有限的中小海外仓企业来说&#xff0c;怎么才能选到性价比比较高的wms海外仓系统呢&#xff1f; 今天我们就来聊一下这个问题&#xff0c;希望对有类似需求的海外仓…

Git基础指令(图文详解)

目录 Git概述Git基础指令Linux系统操作指令 Git软件指令1.配置信息2.名称和邮箱3.初始化版本库4.向版本库中添加文件5.修改版本库文件6. 查看版本库文件历史 7.删除文件8.恢复历史文件 Git概述 Git基础指令 Linux系统操作指令 Git是一款免费、开源的分布式版本控制系统&…

ORACLE中ROWNUM的机制和注意细节(避坑

问题背景 mybatis对接oracle数据库中会用ROWNUM做分页处理。 形如如下sql SELECT * FROM ( SELECT TMP.*, ROWNUM ROW_ID FROM ( SELECT * FROM YOUR_TABLE ) TMP WHERE ROWNUM < ?) WHERE ROW_ID > ?简单说&#xff0c;ROWNUM就是一个对查找结果分配行号的伪列。 问…

github ssh key的SHA256是什么

github ssh key的SHA256是什么 怎么知道github上自己的公钥指纹和本地的公钥是否一致&#xff1f; 计算方法如下&#xff1a; cat .ssh/id_rsa.pub |awk { print $2 } | # Only the actual key data without prefix or commentsbase64 -d | # decode as base64s…

Guava常用方法

目录 一、数学和数值操作 二、并发库 三、缓存 四、集合 五、I/O 与文件操作 六、网络 七、时间处理 八、事件总线 九、反射 十、范围和集合操作 十一、随机数和测试 十二、注解处理 十三、比较器和排序 十四、哈希和散列 Guava 是 Google 开源的一个 Java 工具库&#xff…

【课程总结】Day8(下):计算机视觉基础入门

前言 数据结构 在人工智能领域&#xff0c;机器可以处理的数据类型如上图&#xff0c;大约可以分为以上类别。其中较为常用的数据类别有&#xff1a; 表格类数据 数据特点&#xff1a; 成行成列&#xff1a;一行一个样本&#xff0c;一列一个特征特征之间相互独立&#xff0…

RSS 解析:全球内容分发的利器及使用技巧

使用 RSS 可以将最新的网络内容从一个网站分发到全球数千个其他网站。 RSS 允许快速浏览新闻和更新。 RSS 文档示例 <?xml version"1.0" encoding"UTF-8" ?> <rss version"2.0"><channel><item></item><it…

kotlin 中的数字

以下均来自官方文档&#xff1a; 一、整数类型 1、kotlin中内置的整数类型&#xff0c;有四种不同大小的类型&#xff1a; 类型存储大小&#xff08;比特数&#xff09;最小值最大值Byte8-128127Short16-3276832767Int32-2,147,483,648 (-231)2,147,483,647 (231 - 1)Long64…

rsync常用命令

从远程服务器复制文件到本地 语法&#xff1a; rsync [options] userremote_host:/path/to/remote/source /path/to/local/destination示例&#xff1a; rsync -avz -e ssh userremote_host:/path/to/remote/source/ /path/to/local/destination/从本地复制文件到远程服务器…

Qt | QTextStream 类(文本流)

01、字符编码 1、怎样将字符转换为二进制形式进行存储,存在一个编码的问题,通常都需进行两次编码, 2、字符集:字符的第一次编码是将字符编码为与一个数值(如一个 10 进制整数)相对应,比如把字符 A 编码为 10 进制的 65,B 编码为 66 等。把每一个字符都编码为与一个数值…

现货黄金交易多少克一手?国内外情况大不同

如果大家想参与国际市场上的现货黄金交易&#xff0c;就应该从它交易细则的入手&#xff0c;先彻底认识这个品种&#xff0c;因为它是来自欧美市场的投资方式&#xff0c;所以无论是从合约的计的单位&#xff0c;计价的货币&#xff0c;交易的具体时间&#xff0c;以及买卖过程…

AMS(ActivityManagerService)源码解析2,Android应用是如何被启动的

一个Android应用是如何被启动的 前言总结1. 启动Application1.1 拉起一个新的进程1.2 启动Application1.3 AMS阶段1.4 创建Instrumentation和Application 2. 启动Activity2.1 回到AMS&#xff0c;启动第一个Activity 参考资料 前言 基于源码API 28&#xff0c;30以后的版本启动…