【Linux:信号量、互斥锁、自旋锁】

概述

信号量:用法比较多,常用于资源保护、同步、计数等。
互斥锁:是一种特殊的信号量,用于资源保护,起到互斥的作用。
自旋锁:与互斥锁类似,用于保护资源,起到互斥作用。不同的是自旋锁的导致的调度情况。常用于SMP架构的CPU。

信号量

信号量的类型有许多,比如同步、互斥、计数等作用。信号量会导致休眠,不能在中断上下文中使用。
当信号量初始值>1时,用于资源共享。信号量的初始值就是可以共享资源的任务数量。
当一个任务访问该资源时,信号量值-1,当释放时信号量值+1,当为0时访问,会导致进入睡眠,知道有资源释放,才进行唤醒。

初始化接口:
在这里插入图片描述

使用示例:

定义信号量:

static DEFINE_SEMAPHORE(adb_probe_mutex);

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

互斥锁

可以理解为初始数值为1的信号量,但是比信号量实现简单,没那么多限制。会导致休眠,所以不允许在中断上下文中使用。一般需要长时间占用资源的地方可以使用互斥锁。当请求获取不成功时,任务休眠,进入等待队列,当资源释放时,唤醒等待队列的任务执行。

互斥锁的定义和初始化接口:
在这里插入图片描述
使用示例:

static DEFINE_MUTEX(xxx_mutex);

function()
{
	mutex_lock(&xxx_mutex);
	...
	mutex_unlock(&xxx_mutex);
}

自旋锁

自旋锁一般用于SMP(对称多核)架构的系统,如果当前系统是单CPU,那么自旋锁就是空操作。
自旋锁与信号量不同的是,自旋锁请求和使用过程中不会导致睡眠,当试图获取一个自旋锁资源而获取不到时,会一直占用CPU不释放,原地自旋,直到拿到资源位置。所以,拿到自旋锁资源的内容一定要时间很短。另外,自旋锁可以在中断中使用(因为其不可被打断,是原子操作),但不允许递归使用,否则会出现死锁的情况。

使用示例:
在这里插入图片描述
在这里插入图片描述

更多请参考:
https://blog.csdn.net/xiupong/article/details/113832162

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值