原子操作

原子变量和原子位
在这里插入图片描述
原子操作的API:在这里插入图片描述

在这里插入图片描述

自旋锁

1、自旋锁
在这里插入图片描述自旋锁是轻量级的。
在这里插入图片描述
自旋锁的定义:
在这里插入图片描述自旋锁的API
在这里插入图片描述自旋锁禁止抢占:
在这里插入图片描述
线程与中断:
在这里插入图片描述

自旋锁注意事项

在这里插入图片描述

信号量

在这里插入图片描述在这里插入图片描述

互斥体

在这里插入图片描述

在这里插入图片描述

Linux 并发与竞争实验

原子操作:
在结构体中添加lock原子变量。
在这里插入图片描述
在open函数操作:
锁定驱动
在这里插入图片描述释放驱动
在这里插入图片描述
应用程序模拟应用占用驱动25S

应用程序跑25s,在这25s之内无法再次打开该GPIO。
在这里插入图片描述
在这里插入图片描述

自旋锁

结构体内添加新成员:
在这里插入图片描述在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

spinlock是为了保护变量“state”

考虑到驱动的可移植性,推荐使用如下函数。

spin_lock_irqsave(&dev->lock, flags); 
	if (dev->state)
	{
		dev->state--;/*驱动可以使用*/
	}
	spin_lock_irqsave(&dev->lock, irqflag); 

信号量

包含头文件:

 #include <linux/semaphore.h>

初始化信号量
在这里插入图片描述

获取信号量:
在这里插入图片描述释放信号量:

在这里插入图片描述

信号量在休眠的时候会自动唤醒 进行下次实验。

互斥体

结构体中添加互斥体:
在这里插入图片描述互斥体初始化:

在这里插入图片描述
上锁互斥体:
在这里插入图片描述
解锁互斥体:
在这里插入图片描述

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐