概述
信号量:用法比较多,常用于资源保护、同步、计数等。
互斥锁:是一种特殊的信号量,用于资源保护,起到互斥的作用。
自旋锁:与互斥锁类似,用于保护资源,起到互斥作用。不同的是自旋锁的导致的调度情况。常用于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