一、自旋锁(spinlock)介绍
自旋锁(spinlock)是一种对临界资源进行互斥访问的手段,它是为防止多处理器并发而引入的一种锁,在内核钟大量用于中断处理部分。
自旋锁在锁定的时候不会休眠,一直等待尝试,因此不合适进行长时间的锁保持。自旋锁要慎用,只有在内核可抢占式或SMP的情况下才会用到,自旋锁适用于锁使用者保持锁的时间比较久的情况下。
二、互斥锁(mutex)介绍
互斥锁(Mutex)是Linux内核中的一种同步机制,它用于防止多个线程同时访问共享资源,从而保护临界区的代码不受破坏。
互斥锁在原子操作API的基础上实现,同一时间只能有一个任务持有互斥锁,而且只有这个任务可以对互斥锁进行解锁。当无法获取锁时,线程进入睡眠等待状态。
与自旋锁不同,互斥锁不能进行递归锁定或解锁,只能在同一线程里对应使用,所以它只能用于线程的互斥。
三、自旋锁(spinlock)和互斥锁(mutex)的区别
1、获取锁失败时:自旋锁(spinlock)原地等待,直到得到锁;互斥锁(mutex)线程释放CPU给其他线程,等到线程下一次唤醒。
2、开销成本:自旋锁(spinlock)自旋锁开销较小;互斥锁(mutex)无法获取到互斥锁时,会发生上下文切换并休眠,上下文切换的开销相对较大,因此在需要保护的临界区较小时,宜选用自旋锁,否则选用互斥锁。
3、使用场景:互斥锁(mutex)只能在进程上下文中使用,不能在中断上下文中使用,而自旋锁(spinlock)可以在中断上下文中使用。
4、互斥锁只能由获取到该锁的进程来释放,而自旋锁的释放没有这个限制。