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

相关推荐
ltl4 小时前
大多数「无锁」代码其实不是无锁的
linux
ltl4 小时前
Linux 内核的内存屏障:一个让我调了三天的 bug
linux
paopaokaka_luck6 小时前
基于springboot3+vue3的企业考勤管理系统(部门树递归、Echarts图形化分析)
开发语言·spring boot·学习·echarts·mybatis·需求分析·代码规范
minglie16 小时前
zynq高频小数据量PS闭环 抖动时间的测量
学习
long3166 小时前
MySQL 学习练习(配套 01 入门资料)
数据库·学习·mysql
Lonely 净土7 小时前
Rocky Linux 安装教程
linux·运维·服务器
梦雨生生7 小时前
java开发工具(学习第一天)
java·开发语言·学习
李白你好11 小时前
Windows 离线 Linux 提权辅助查询工具
linux
Lust Dusk11 小时前
记一次Linux应急响应题目解析
linux·运维·服务器·网络·安全·网络安全
ShineWinsu12 小时前
对于Linux:五种IO模型以及非阻塞IO的详细解析
linux·c++·面试·io·阻塞·非阻塞·fcntl