【Linux驱动层】iTOP-RK3568学习之路(五):并发与竞争

本人在听讯为的课时,哪怕是照抄,编译后,这里的代码执行不了,只能做笔记了。

一、原子操作

​ 借用原子是"化学反应中最小的微粒"这个概念,用原子来表述---个操作是不可以被打断,拆分的操作。简单,看API就行。

二、自旋锁

  1. 自旋锁是给一段代码加锁(临界区),成功获取自旋锁以后才可以运行临界区中的代码。运行结束以后释放自旋锁。
  2. 自旋锁获取失败会一直轮询检测锁的状态,也就是"原地等待",此时CPU不会去做任何事情。
  3. 在单CPU和内核可抢占的系统中,自旋锁持有期间中内核的抢占将被禁止。

注意事项:

​ 假设A获得了自旋锁,且在临界区,即没有释放锁。这时B申请加锁是无效的,即使A出了临界区,释放了锁,也不会通知B。B要自己再次申请加锁。

c 复制代码
// 定义自旋锁
spinlock_t lock;
// 初始化自旋锁。
spin_lock_init(&lock) ;
// 加锁
spin_lock(&lock) ;

...../*临界区*/.....

// 解锁
spin_unlock(&lock) ;

三、信号量

​ 假如有5把钥匙,就代表有5个人可以进入到这个屋子里。每有一个人进入到屋子里,钥匙就少一把,信号量减一。当钥匙为0时,其他人就不能进入。

c 复制代码
void up(struct semaphore *sem) ;

该函数释放信号量 sem,自动唤醒等待者。也就是说:还钥匙,信号量的值加1。

​ 假设A获得了自旋锁(钥匙只有一把),且在临界区,即没有释放锁。这时B申请加锁是无效的,即使A出了临界区,释放了锁,也不会通知B。B要自己再次申请加锁。​ 但信号量不同,当A在临界区,B的申请会导致自身休眠。当A出了临界区,还了钥匙后,B被自动唤醒,不用再一次申请拿钥匙。

四、互斥锁

​ mutex的使用方法和信号量完全一样,只是钥匙只有一把。

相关推荐
Starry_hello world3 小时前
Linux 的准备工作
linux·笔记·有问必答
_考不上研究生不改名4 小时前
【完美解决】VSCode连接HPC节点,已配置密钥却还是提示需要输入密码
linux·服务器·vscode·远程连接·hpc·超算集群
_长银5 小时前
Vim搜索和替换
linux·编辑器·vim
viperrrrrrrrrr75 小时前
大数据学习(105)-Hbase
大数据·学习·hbase
爱的叹息6 小时前
Spring Boot 自定义配置类(包含字符串、数字、布尔、小数、集合、映射、嵌套对象)实现步骤及示例
java·linux·spring boot
嵌入式-老费6 小时前
Linux上位机开发实践(一个硬件算法加速的示例)
linux·运维·服务器
前进的程序员7 小时前
Linux C 与 C 语言的区别及开发差异
linux·运维·c语言
行思理7 小时前
go语言应该如何学习
开发语言·学习·golang
CZIDC7 小时前
华为昇腾服务器上查看固件、驱动和CANN版本的常用方法
linux·运维·服务器
oceanweave8 小时前
【k8s学习之CSI】理解 LVM 存储概念和相关操作
学习·容器·kubernetes