【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的使用方法和信号量完全一样,只是钥匙只有一把。

相关推荐
丰锋ff1 小时前
操作系统学习笔记第3章 内存管理(灰灰题库)
笔记·学习
柳如烟@2 小时前
在Rocky Linux 9.5上部署MongoDB 8.0.9:从安装到认证的完整指南
linux·运维·mongodb
jackson凌2 小时前
【Java学习笔记】equals方法
java·笔记·学习
虾球xz2 小时前
游戏引擎学习第282天:Z轴移动与摄像机运动
c++·学习·游戏引擎
QQ2740287562 小时前
Kite AI 自动机器人部署教程
linux·运维·服务器·人工智能·机器人·web3
.小墨迹3 小时前
Apollo学习——planning模块(3)之planning_base
linux·开发语言·c++·学习·自动驾驶
龙湾开发3 小时前
计算机图形学编程(使用OpenGL和C++)(第2版)学习笔记 10.增强表面细节(一)过程式凹凸贴图
c++·笔记·学习·3d·图形渲染
自学互联网3 小时前
系统集成项目管理工程师学习笔记
笔记·学习
影龙帝皖3 小时前
Linux服务之lvs+keepalived nginx+keepalived负载均衡实例解析
linux·nginx·lvs
八月的雨季 最後的冰吻4 小时前
SIP协议栈--osip源码梳理
linux·服务器·网络·c++·网络协议