您的位置:首页 > 其它

自旋锁与信号量的区别是什么? 分别在什么场景下使用?

2014-10-21 11:30 1021 查看



自旋锁与信号量作为同步机制,都是用来保护临界区的,但是它们的工作方式完全不一样。

自旋锁只有两种状态,即LOCKED与UNLOCKED。

而信号量既可以作为互斥锁来使用(此时具有0和1两种状态),也可以作为资源计数器来使用(此时为正整数,具有不同的值,例如:0,1,2,...)
进程在获取自旋锁时,会持续地查询锁的状态(读改写的原子操作),若未获取到锁则CPU会处于一直忙等待状态,这正是“自旋”的含义。

进程在获取信号量时,如果没有获取到则会转入睡眠状态,在未来的某个时间进程被唤醒并重新获取信号量。
自旋锁原本用于多核SMP环境下,在并发时进行临界区的保护,以上第2点讲到的忙等待就是这个情形下的经典操作。但是在单核环境下,其经典操作会有些不同。

在单核的情形下,若开了抢占功能,则其等同于SMP的环境,也需要考虑并发的问题,采用禁止抢占来加锁,采用使能抢占来解锁。

在单核的情形下,若没有开抢占功能,则自旋锁被优化为什么也不做。
在中断上下文(软中断,硬中断)使用自旋锁,需要使用带有中断操作的自旋锁版本。
自旋锁可以用在中断上下文。

但是信号量不能用在中断上下文,因为它会睡眠,这是不允许的。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐