多线程场景下,单纯的对访问资源进行串行访问限制,可以用互斥。但互斥中,某个线程mutex在没有得到锁的情况下,会sleep,也就是说cpu会切换线程;
但有些场景下等一下可能就得到锁了,而等一下的耗时可能比线程切换时间还短。这时就该spinlock上场了,spinlock在没有拿到锁时,会在原地等待,直到获取到锁。比如在while循环不断原子操作查看lock的值)
注意:针对多CPU(存在资源抢占的情况)使用spinlock才有意义。
mutex这种会休眠的互斥锁,不能用于中断函数;同理信号量内部也是用互斥锁mutex实现的,所以在中断函数中也不能用信号量。
关于死锁问题:
如果一个低优先级的任务使用spinlock抢占了资源,但一个更高优先级的任务调度了,也要获取这个锁,但锁在低优先级任务手里,但它一直没有机会执行,也就释放不了锁。这时就死锁了。